Skip to content

Commit cf4b8ea

Browse files
committed
list_set optional backup
1 parent 83833e2 commit cf4b8ea

File tree

1 file changed

+64
-5
lines changed

1 file changed

+64
-5
lines changed

homework/src/list_set/optimistic_fine_grained.rs

Lines changed: 64 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,18 @@ impl<'g, T: Ord> Cursor<'g, T> {
4444
///
4545
/// Return `Err(())` if the cursor cannot move.
4646
fn find(&mut self, key: &T, guard: &'g Guard) -> Result<bool, ()> {
47-
todo!()
47+
while self.prev.validate() {
48+
if let Some(curr_node) = unsafe { self.curr.as_ref() } {
49+
if curr_node.data == *key {
50+
return Ok(true);
51+
}
52+
self.prev = unsafe { curr_node.next.read_lock() };
53+
self.curr = self.prev.load(SeqCst, guard);
54+
} else {
55+
return Ok(false);
56+
}
57+
}
58+
Err(())
4859
}
4960
}
5061

@@ -65,21 +76,69 @@ impl<T> OptimisticFineGrainedListSet<T> {
6576

6677
impl<T: Ord> OptimisticFineGrainedListSet<T> {
6778
fn find<'g>(&'g self, key: &T, guard: &'g Guard) -> Result<(bool, Cursor<'g, T>), ()> {
68-
todo!()
79+
let mut cur = self.head(guard);
80+
cur.find(key, guard).map(|found| {
81+
(true, cur)
82+
})
6983
}
7084
}
7185

7286
impl<T: Ord> ConcurrentSet<T> for OptimisticFineGrainedListSet<T> {
7387
fn contains(&self, key: &T) -> bool {
74-
todo!()
88+
let guard = pin();
89+
match self.find(key, &guard) {
90+
Ok((found, _)) => found,
91+
Err(_) => false,
92+
}
7593
}
7694

7795
fn insert(&self, key: T) -> bool {
78-
todo!()
96+
let guard = pin();
97+
let mut cur = self.head(&guard);
98+
99+
'outer: loop {
100+
if !cur.prev.validate() {
101+
continue;
102+
}
103+
if let Some(curr_node) = unsafe { cur.curr.as_ref() } {
104+
match curr_node.data.cmp(&key) {
105+
Less => {
106+
cur.prev = unsafe { curr_node.next.read_lock() };
107+
cur.curr = cur.prev.load(SeqCst, &guard);
108+
},
109+
Equal => return false,
110+
Greater => break 'outer,
111+
}
112+
} else {
113+
break 'outer;
114+
}
115+
}
116+
117+
// Insert before the current node
118+
let new_node = Node::new(key, cur.curr);
119+
cur.prev.store(new_node, SeqCst);
120+
return true;
79121
}
80122

81123
fn remove(&self, key: &T) -> bool {
82-
todo!()
124+
let guard = pin();
125+
loop {
126+
if let Ok((found, mut cursor)) = self.find(key, &guard) {
127+
if !found {
128+
return false;
129+
}
130+
if let Some(curr_node) = unsafe { cursor.curr.as_ref() } {
131+
if cursor.prev.validate() {
132+
let next_guard = unsafe { curr_node.next.read_lock() };
133+
while let Err(()) = cursor.prev.clone().upgrade() {}
134+
// todo upgrade to write lock
135+
todo!();
136+
}
137+
}
138+
} else {
139+
// find failed, try again
140+
}
141+
}
83142
}
84143
}
85144

0 commit comments

Comments
 (0)