@@ -588,8 +588,12 @@ void *critnib_remove(struct critnib *c, word key, void **ref) {
588588del_leaf :
589589 value = k -> value ;
590590 if (c -> cb_free_leaf ) {
591- utils_atomic_store_release_ptr (& k -> to_be_freed , value );
592- utils_atomic_store_release_ptr (& k -> value , NULL );
591+ fprintf (stderr , "%p critnib_remove_IN(value=%p/%p, ref_count=%lu)\n" ,
592+ (void * )k -> key , value , k -> to_be_freed , k -> ref_count );
593+ if (value ) {
594+ utils_atomic_store_release_ptr (& k -> to_be_freed , value );
595+ utils_atomic_store_release_ptr (& k -> value , NULL );
596+ }
593597 * ref = k ;
594598 }
595599 c -> pending_del_leaves [del ] = k ;
@@ -607,20 +611,32 @@ int critnib_release(struct critnib *c, void *ref) {
607611 return -1 ;
608612 }
609613
614+ fprintf (stderr , ">>> critnib_release(ref=%p)\n" , ref );
615+
610616 struct critnib_leaf * k = (struct critnib_leaf * )ref ;
611617
612618 uint64_t ref_count ;
613619 utils_atomic_load_acquire_u64 (& k -> ref_count , & ref_count );
614620
615621 if (ref_count == 0 ) {
622+ fprintf (stderr ,
623+ "%p critnib_release(value=%p/%p, ref_count=0) RETURN ! k=%p\n" ,
624+ (void * )k -> key , k -> value , k -> to_be_freed , k );
616625 return -1 ;
617626 }
618627
619628 /* decrement the reference count */
620629 if (utils_atomic_decrement_u64 (& k -> ref_count ) == 1 ) {
621630 void * to_be_freed = NULL ;
622631 utils_atomic_load_acquire_ptr (& k -> to_be_freed , & to_be_freed );
632+ fprintf (stderr ,
633+ "%p critnib_release(value=%p/%p, ref_count=0) ==0 k=%p\n" ,
634+ (void * )k -> key , k -> value , to_be_freed , k );
623635 if (to_be_freed ) {
636+ fprintf (
637+ stderr ,
638+ "%p c->cb_free_leaf(key=%p, value=%p/%p, ref_count=0) k=%p\n" ,
639+ to_be_freed , (void * )k -> key , k -> value , to_be_freed , k );
624640 utils_atomic_store_release_ptr (& k -> to_be_freed , NULL );
625641 c -> cb_free_leaf (c -> leaf_allocator , to_be_freed );
626642 }
@@ -639,6 +655,10 @@ int critnib_release(struct critnib *c, void *ref) {
639655 }
640656
641657 return 0 ;
658+ } else {
659+ fprintf (stderr ,
660+ "%p critnib_release(value=%p/%p, ref_count=%lu) ELSE k=%p\n" ,
661+ (void * )k -> key , k -> value , k -> to_be_freed , k -> ref_count , k );
642662 }
643663
644664#ifndef NDEBUG
0 commit comments