Skip to content

Commit 93628a7

Browse files
committed
add error handling
1 parent adcb44e commit 93628a7

File tree

1 file changed

+36
-27
lines changed

1 file changed

+36
-27
lines changed

homework/src/list_set/optimistic_fine_grained.rs

Lines changed: 36 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -102,35 +102,43 @@ impl<T: Ord> ConcurrentSet<T> for OptimisticFineGrainedListSet<T> {
102102

103103
fn insert(&self, key: T) -> bool {
104104
let guard = pin();
105-
let mut cur = self.head(&guard);
106105

107106
'outer: loop {
108-
if !cur.prev.validate() {
109-
continue;
110-
}
111-
if let Some(curr_node) = unsafe { cur.curr.as_ref() } {
112-
match curr_node.data.cmp(&key) {
113-
Less => {
114-
cur.prev.finish();
115-
cur.prev = unsafe { curr_node.next.read_lock() };
116-
cur.curr = cur.prev.load(SeqCst, &guard);
117-
}
118-
Equal => {
119-
cur.prev.finish(); // FUCK finish
120-
return false;
107+
let mut cur = self.head(&guard);
108+
loop {
109+
if !cur.prev.validate() {
110+
cur.prev.finish();
111+
continue 'outer;
112+
}
113+
if let Some(curr_node) = unsafe { cur.curr.as_ref() } {
114+
match curr_node.data.cmp(&key) {
115+
Less => {
116+
cur.prev.finish();
117+
cur.prev = unsafe { curr_node.next.read_lock() };
118+
cur.curr = cur.prev.load(SeqCst, &guard);
119+
}
120+
Equal => {
121+
cur.prev.finish(); // FUCK finish
122+
return false;
123+
}
124+
Greater => break,
121125
}
122-
Greater => break 'outer,
126+
} else {
127+
break;
123128
}
124-
} else {
125-
break 'outer;
126129
}
127-
}
128130

129-
// Insert before the current node
130-
let new_node = Node::new(key, cur.curr);
131-
let write_guard = cur.prev.upgrade().unwrap();
132-
write_guard.store(new_node, SeqCst);
133-
true
131+
// Insert before the current node
132+
let mut write_guard_result = cur.prev.upgrade();
133+
if write_guard_result.is_err() {
134+
continue;
135+
}
136+
let write_guard = write_guard_result.unwrap();
137+
138+
let new_node = Node::new(key, cur.curr);
139+
write_guard.store(new_node, SeqCst);
140+
return true;
141+
}
134142
}
135143

136144
fn remove(&self, key: &T) -> bool {
@@ -164,12 +172,13 @@ impl<T: Ord> ConcurrentSet<T> for OptimisticFineGrainedListSet<T> {
164172
cursor.prev.finish();
165173
continue 'outer; // retry because the previous node is invalid. It's destroyed by write lock.
166174
}
167-
let write_guard = cursor.prev.upgrade().unwrap();
175+
let write_guard_result = cursor.prev.upgrade();
176+
if write_guard_result.is_err() {
177+
continue 'outer; // retry because the previous node is invalid. It's destroyed by write lock.
178+
}
179+
let write_guard = write_guard_result.unwrap();
168180
let write_guard_next = curr_node.next.write_lock(); // !!! to invalidate iterator.
169181
write_guard.store(write_guard_next.load(SeqCst, &guard), SeqCst);
170-
unsafe {
171-
guard.defer_destroy(cursor.curr);
172-
}
173182
return true;
174183
}
175184
Greater => {

0 commit comments

Comments
 (0)