@@ -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
6677impl < 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
7286impl < 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