@@ -170,7 +170,7 @@ impl Tree {
170170 // success
171171 if let Some ( res) = subscriber_reservation. take ( ) {
172172 let event =
173- subscription:: Event :: Set ( key. as_ref ( ) . to_vec ( ) , value) ;
173+ subscription:: Event :: Set ( key. as_ref ( ) . into ( ) , value) ;
174174
175175 res. complete ( event) ;
176176 }
@@ -409,7 +409,7 @@ impl Tree {
409409 if link. is_ok ( ) {
410410 // success
411411 if let Some ( res) = subscriber_reservation. take ( ) {
412- let event = subscription:: Event :: Del ( key. as_ref ( ) . to_vec ( ) ) ;
412+ let event = subscription:: Event :: Del ( key. as_ref ( ) . into ( ) ) ;
413413
414414 res. complete ( event) ;
415415 }
@@ -503,9 +503,9 @@ impl Tree {
503503 if link. is_ok ( ) {
504504 if let Some ( res) = subscriber_reservation. take ( ) {
505505 let event = if let Some ( new) = new {
506- subscription:: Event :: Set ( key. as_ref ( ) . to_vec ( ) , new)
506+ subscription:: Event :: Set ( key. as_ref ( ) . into ( ) , new)
507507 } else {
508- subscription:: Event :: Del ( key. as_ref ( ) . to_vec ( ) )
508+ subscription:: Event :: Del ( key. as_ref ( ) . into ( ) )
509509 } ;
510510
511511 res. complete ( event) ;
@@ -676,8 +676,7 @@ impl Tree {
676676 /// // events is a blocking `Iterator` over `Event`s
677677 /// for event in events.take(1) {
678678 /// match event {
679- /// Event::Set(key, value) => assert_eq!(key, vec![0]),
680- /// Event::Merge(key, partial_value) => {}
679+ /// Event::Set(key, value) => assert_eq!(key.as_ref(), &[0]),
681680 /// Event::Del(key) => {}
682681 /// }
683682 /// }
@@ -881,15 +880,48 @@ impl Tree {
881880
882881 let merge_operator = merge_operator_opt. unwrap ( ) ;
883882
884- let key = key. as_ref ( ) ;
885- let mut current = self . get ( key) ?;
886-
887883 loop {
888- let tmp = current. as_ref ( ) . map ( AsRef :: as_ref) ;
889- let next = merge_operator ( key, tmp, value. as_ref ( ) ) . map ( IVec :: from) ;
890- match self . cas :: < _ , _ , IVec > ( key, tmp, next. clone ( ) ) ? {
891- Ok ( ( ) ) => return Ok ( next) ,
892- Err ( new_current) => current = new_current,
884+ let guard = pin ( ) ;
885+ let View { ptr, pid, node, .. } =
886+ self . node_for_key ( key. as_ref ( ) , & guard) ?;
887+
888+ let ( encoded_key, current_value) =
889+ if let Some ( ( k, v) ) = node. leaf_pair_for_key ( key. as_ref ( ) ) {
890+ ( k. clone ( ) , Some ( v. clone ( ) ) )
891+ } else {
892+ let k = prefix_encode ( & node. lo , key. as_ref ( ) ) ;
893+ let old_v = None ;
894+ ( k, old_v)
895+ } ;
896+
897+ let tmp = current_value. as_ref ( ) . map ( AsRef :: as_ref) ;
898+ let new = merge_operator ( key. as_ref ( ) , tmp, value. as_ref ( ) )
899+ . map ( IVec :: from) ;
900+
901+ let mut subscriber_reservation = self . subscriptions . reserve ( & key) ;
902+
903+ let frag = if let Some ( ref new) = new {
904+ Frag :: Set ( encoded_key, new. clone ( ) )
905+ } else {
906+ Frag :: Del ( encoded_key)
907+ } ;
908+ let link = self . context . pagecache . link ( pid, ptr, frag, & guard) ?;
909+
910+ if link. is_ok ( ) {
911+ if let Some ( res) = subscriber_reservation. take ( ) {
912+ let event = if let Some ( new) = & new {
913+ subscription:: Event :: Set (
914+ key. as_ref ( ) . into ( ) ,
915+ new. clone ( ) ,
916+ )
917+ } else {
918+ subscription:: Event :: Del ( key. as_ref ( ) . into ( ) )
919+ } ;
920+
921+ res. complete ( event) ;
922+ }
923+
924+ return Ok ( new) ;
893925 }
894926 M . tree_looped ( ) ;
895927 }
0 commit comments