@@ -57,6 +57,13 @@ pub trait Collector {
5757 crate :: alloc:: arena2:: ArenaAllocError ,
5858 > ;
5959
60+ fn alloc_empty_ephemeron_node < ' gc , K : Trace + ' static > (
61+ & ' gc self ,
62+ ) -> Result <
63+ crate :: alloc:: arena2:: ArenaPointer < ' gc , internals:: Ephemeron < K , ( ) > > ,
64+ crate :: alloc:: arena2:: ArenaAllocError ,
65+ > ;
66+
6067 // Register a weak map with the GC so it can prune dead entries.
6168 #[ doc( hidden) ]
6269 fn track_weak_map ( & self , map : core:: ptr:: NonNull < dyn ErasedWeakMap > ) ;
@@ -487,6 +494,38 @@ impl Collector for MarkSweepGarbageCollector {
487494 Ok ( inner_ptr)
488495 }
489496
497+ fn alloc_empty_ephemeron_node < ' gc , K : Trace + ' static > (
498+ & ' gc self ,
499+ ) -> Result < ArenaPointer < ' gc , Ephemeron < K , ( ) > > , crate :: alloc:: arena2:: ArenaAllocError > {
500+ if self . collect_needed . get ( ) && !self . is_collecting . get ( ) {
501+ self . collect_needed . set ( false ) ;
502+ self . collect ( ) ;
503+ }
504+
505+ let ephemeron = Ephemeron :: < K , ( ) > :: new_empty ( self . trace_color . get ( ) ) ;
506+
507+ let mut alloc = self . allocator . borrow_mut ( ) ;
508+ let inner_ptr = alloc. try_alloc ( ephemeron) ?;
509+ let needs_collect = !alloc. is_below_threshold ( ) ;
510+ drop ( alloc) ;
511+
512+ if needs_collect {
513+ self . collect_needed . set ( true ) ;
514+ }
515+
516+ let eph_ptr = inner_ptr
517+ . as_ptr ( )
518+ . cast :: < ArenaHeapItem < Ephemeron < NonTraceable , NonTraceable > > > ( ) ;
519+
520+ if self . is_collecting . get ( ) {
521+ self . pending_ephemeron_queue . borrow_mut ( ) . push ( eph_ptr) ;
522+ } else {
523+ self . ephemeron_queue . borrow_mut ( ) . push ( eph_ptr) ;
524+ }
525+
526+ Ok ( inner_ptr)
527+ }
528+
490529 fn track_weak_map ( & self , map : core:: ptr:: NonNull < dyn ErasedWeakMap > ) {
491530 self . weak_maps . borrow_mut ( ) . push ( map) ;
492531 }
0 commit comments