Skip to content

Commit adcb44e

Browse files
committed
refactor code
1 parent 61666a2 commit adcb44e

File tree

1 file changed

+46
-42
lines changed

1 file changed

+46
-42
lines changed

homework/src/list_set/optimistic_fine_grained.rs

Lines changed: 46 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -128,9 +128,8 @@ impl<T: Ord> ConcurrentSet<T> for OptimisticFineGrainedListSet<T> {
128128

129129
// Insert before the current node
130130
let new_node = Node::new(key, cur.curr);
131-
if let Ok(write_guard) = cur.prev.upgrade() {
132-
write_guard.store(new_node, SeqCst);
133-
}
131+
let write_guard = cur.prev.upgrade().unwrap();
132+
write_guard.store(new_node, SeqCst);
134133
true
135134
}
136135

@@ -144,32 +143,36 @@ impl<T: Ord> ConcurrentSet<T> for OptimisticFineGrainedListSet<T> {
144143
'outer: loop {
145144
let mut cursor = self.head(&guard);
146145
loop {
147-
if cursor.prev.validate() {
148-
if let Some(curr_node) = unsafe { cursor.curr.as_ref() } {
149-
match curr_node.data.cmp(key) {
150-
Less => {
151-
cursor.prev.finish();
152-
cursor.prev = unsafe { curr_node.next.read_lock() };
153-
cursor.curr = cursor.prev.load(SeqCst, &guard);
154-
}
155-
Equal => {
156-
if !cursor.prev.validate() {
157-
continue 'outer; // retry because the previous node is invalid. It's destroyed by write lock.
158-
}
159-
let write_guard = cursor.prev.upgrade().unwrap();
160-
let write_guiard_next = curr_node.next.write_lock(); // !!! to invalidate iterator.
161-
write_guard.store(write_guiard_next.load(SeqCst, &guard), SeqCst);
162-
unsafe {
163-
guard.defer_destroy(cursor.curr);
164-
}
165-
return true;
166-
}
167-
Greater => {
168-
cursor.prev.finish();
169-
return false;
170-
}
146+
if !cursor.prev.validate() {
147+
cursor.prev.finish();
148+
continue 'outer;
149+
}
150+
let cursor_ref = unsafe { cursor.curr.as_ref() };
151+
if cursor_ref.is_none() {
152+
cursor.prev.finish();
153+
return false;
154+
}
155+
let curr_node = cursor_ref.unwrap();
156+
match curr_node.data.cmp(key) {
157+
Less => {
158+
cursor.prev.finish();
159+
cursor.prev = unsafe { curr_node.next.read_lock() };
160+
cursor.curr = cursor.prev.load(SeqCst, &guard);
161+
}
162+
Equal => {
163+
if !cursor.prev.validate() {
164+
cursor.prev.finish();
165+
continue 'outer; // retry because the previous node is invalid. It's destroyed by write lock.
166+
}
167+
let write_guard = cursor.prev.upgrade().unwrap();
168+
let write_guard_next = curr_node.next.write_lock(); // !!! to invalidate iterator.
169+
write_guard.store(write_guard_next.load(SeqCst, &guard), SeqCst);
170+
unsafe {
171+
guard.defer_destroy(cursor.curr);
171172
}
172-
} else {
173+
return true;
174+
}
175+
Greater => {
173176
cursor.prev.finish();
174177
return false;
175178
}
@@ -204,22 +207,23 @@ impl<'g, T> Iterator for Iter<'g, T> {
204207
if !self.cursor.prev.validate() {
205208
return Some(Err(()));
206209
}
207-
if let Some(curr_node) = unsafe { self.cursor.curr.as_ref() } {
208-
let cur = unsafe { ManuallyDrop::take(&mut self.cursor) };
209-
let next_prev_guard = unsafe { curr_node.next.read_lock() };
210-
if !next_prev_guard.validate() {
211-
return Some(Err(()));
212-
}
213-
let next_node = next_prev_guard.load(SeqCst, self.guard);
214-
self.cursor = ManuallyDrop::new(Cursor {
215-
prev: next_prev_guard,
216-
curr: next_node,
217-
});
210+
let cursor_ref = unsafe { self.cursor.curr.as_ref() };
211+
cursor_ref?;
212+
let curr_node = cursor_ref.unwrap();
213+
let cur = unsafe { ManuallyDrop::take(&mut self.cursor) };
214+
let next_prev_guard = unsafe { curr_node.next.read_lock() };
215+
if !next_prev_guard.validate() {
216+
next_prev_guard.finish();
218217
cur.prev.finish();
219-
Some(Ok(&curr_node.data))
220-
} else {
221-
None
218+
return Some(Err(()));
222219
}
220+
let next_node = next_prev_guard.load(SeqCst, self.guard);
221+
self.cursor = ManuallyDrop::new(Cursor {
222+
prev: next_prev_guard,
223+
curr: next_node,
224+
});
225+
cur.prev.finish();
226+
Some(Ok(&curr_node.data))
223227
}
224228
}
225229

0 commit comments

Comments
 (0)