@@ -51,6 +51,10 @@ pub trait Collector {
5151 value : V ,
5252 ) -> Result < PoolPointer < ' gc , Ephemeron < K , V > > , PoolAllocError > ;
5353
54+ fn alloc_empty_ephemeron_node < ' gc , K : Trace + ' static > (
55+ & ' gc self ,
56+ ) -> Result < PoolPointer < ' gc , Ephemeron < K , ( ) > > , PoolAllocError > ;
57+
5458 // Register a weak map with the GC so it can prune dead entries
5559 #[ doc( hidden) ]
5660 fn track_weak_map ( & self , map : core:: ptr:: NonNull < dyn ErasedWeakMap > ) ;
@@ -487,6 +491,38 @@ impl Collector for MarkSweepGarbageCollector {
487491 Ok ( inner_ptr)
488492 }
489493
494+ fn alloc_empty_ephemeron_node < ' gc , K : Trace + ' static > (
495+ & ' gc self ,
496+ ) -> Result < PoolPointer < ' gc , Ephemeron < K , ( ) > > , crate :: alloc:: mempool3:: PoolAllocError > {
497+ if self . collect_needed . get ( ) && !self . is_collecting . get ( ) {
498+ self . collect_needed . set ( false ) ;
499+ self . collect ( ) ;
500+ }
501+
502+ let ephemeron = Ephemeron :: < K , ( ) > :: new_empty ( self . trace_color . get ( ) ) ;
503+
504+ let mut alloc = self . allocator . borrow_mut ( ) ;
505+ let inner_ptr = alloc. try_alloc ( ephemeron) ?;
506+ let needs_collect = !alloc. is_below_threshold ( ) ;
507+ drop ( alloc) ;
508+
509+ if needs_collect {
510+ self . collect_needed . set ( true ) ;
511+ }
512+
513+ let eph_ptr = inner_ptr
514+ . as_ptr ( )
515+ . cast :: < PoolItem < Ephemeron < NonTraceable , NonTraceable > > > ( ) ;
516+
517+ if self . is_collecting . get ( ) {
518+ self . pending_ephemeron_queue . borrow_mut ( ) . push ( eph_ptr) ;
519+ } else {
520+ self . ephemeron_queue . borrow_mut ( ) . push ( eph_ptr) ;
521+ }
522+
523+ Ok ( inner_ptr)
524+ }
525+
490526 fn track_weak_map (
491527 & self ,
492528 map : core:: ptr:: NonNull <
0 commit comments