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