@@ -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