From 2560ba42539f4c95cb8c6b089227ad4f40f76453 Mon Sep 17 00:00:00 2001 From: Nilstrieb <48135649+Nilstrieb@users.noreply.github.com> Date: Sun, 15 Jan 2023 11:32:11 +0100 Subject: [PATCH] linked --- src/innocent_linked_list.rs | 34 ++++++++++++++++++++++++++++++++++ src/lib.rs | 1 + src/sendsync.rs | 10 ++++++---- 3 files changed, 41 insertions(+), 4 deletions(-) create mode 100644 src/innocent_linked_list.rs diff --git a/src/innocent_linked_list.rs b/src/innocent_linked_list.rs new file mode 100644 index 0000000..dc4fe22 --- /dev/null +++ b/src/innocent_linked_list.rs @@ -0,0 +1,34 @@ +pub struct Node<'a, 'n, T> { + item: T, + outer: Option<&'a mut Node<'a, 'n, T>>, +} + +impl<'a, 'n, T> Node<'a, 'n, T> { + pub fn new(item: T) -> Self { + Self { item, outer: None } + } + + pub fn push(&mut self, item: T, with_func: impl FnOnce(&mut Self) -> R) -> R { + let mut inner = Node { + item, + outer: Some(self), + }; + with_func(&mut inner) + } +} + +#[cfg(test)] +mod tests { + use super::Node; + + #[test] + fn push() { + let mut list = Node::::new(0); + + inner(&mut list); + + fn inner(list: &mut Node) { + list.push(1, |list| {}); + } + } +} diff --git a/src/lib.rs b/src/lib.rs index 7028ba3..783e811 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -4,6 +4,7 @@ #![feature(negative_impls)] pub mod cfg_match; +pub mod innocent_linked_list; pub mod sendsync; pub mod unroll_int; pub mod unsized_clone; diff --git a/src/sendsync.rs b/src/sendsync.rs index d39f1ed..62c5043 100644 --- a/src/sendsync.rs +++ b/src/sendsync.rs @@ -1,3 +1,5 @@ +#![cfg_attr(not(test), allow(unused))] + use std::{ cell::{Cell, UnsafeCell}, rc::Rc, @@ -27,9 +29,9 @@ fn rc_the_new_contender() { let x = Rc::new(0); let x2 = x.clone(); spawn(move || { - x2.clone(); + let _ = x2.clone(); }); - x.clone(); // DATA RACE + let _ = x.clone(); // DATA RACE } // Oh no, we have a data race. This is not exactly good, in fact it's really bad. @@ -53,9 +55,9 @@ fn but_arc_is_fine() { let x = Arc::new(0); let x2 = x.clone(); spawn(move || { - x2.clone(); + let _ = x2.clone(); }); - x.clone(); + let _ = x.clone(); } // Arc is fine here because it uses atomics internally. But it fails to compile! Here, Arc (or us in this case)