@@ -49,6 +49,9 @@ struct objspace {
4949 struct rb_gc_vm_context vm_context ;
5050
5151 unsigned int fork_hook_vm_lock_lev ;
52+
53+ uintptr_t vo_bit_log_region_size ;
54+ uintptr_t vo_bit_base_addr ;
5255};
5356
5457#define OBJ_FREE_BUF_CAPACITY 128
@@ -591,6 +594,9 @@ rb_gc_impl_objspace_init(void *objspace_ptr)
591594 objspace -> cond_world_started = (pthread_cond_t )PTHREAD_COND_INITIALIZER ;
592595
593596 objspace -> event_hook_mutex = (pthread_mutex_t )PTHREAD_MUTEX_INITIALIZER ;
597+
598+ objspace -> vo_bit_log_region_size = mmtk_get_vo_bit_log_region_size ();
599+ objspace -> vo_bit_base_addr = mmtk_get_vo_bit_base_addr ();
594600}
595601
596602void
@@ -883,6 +889,18 @@ mmtk_buffer_obj_free_candidate(struct MMTk_ractor_cache *cache, VALUE obj)
883889 }
884890}
885891
892+ static void
893+ mmtk_post_alloc_fast_immix (struct objspace * objspace , struct MMTk_ractor_cache * ractor_cache , uintptr_t obj )
894+ {
895+ uintptr_t region_offset = obj >> objspace -> vo_bit_log_region_size ;
896+ uintptr_t byte_offset = region_offset / 8 ;
897+ uintptr_t bit_offset = region_offset % 8 ;
898+ uintptr_t meta_byte_address = objspace -> vo_bit_base_addr + byte_offset ;
899+ uint8_t byte = 1 << bit_offset ;
900+ uint8_t * meta_byte_ptr = (uint8_t * )meta_byte_address ;
901+ * meta_byte_ptr |= byte ;
902+ }
903+
886904VALUE
887905rb_gc_impl_new_obj (void * objspace_ptr , void * cache_ptr , VALUE klass , VALUE flags , bool wb_protected , size_t alloc_size )
888906{
@@ -921,8 +939,13 @@ rb_gc_impl_new_obj(void *objspace_ptr, void *cache_ptr, VALUE klass, VALUE flags
921939 alloc_obj [0 ] = flags ;
922940 alloc_obj [1 ] = klass ;
923941
924- // TODO: implement fast path for mmtk_post_alloc
925- mmtk_post_alloc (ractor_cache -> mutator , (void * )alloc_obj , alloc_size , MMTK_ALLOCATION_SEMANTICS_DEFAULT );
942+ if (ractor_cache -> bump_pointer == NULL ) {
943+ mmtk_post_alloc (ractor_cache -> mutator , (void * )alloc_obj , alloc_size , MMTK_ALLOCATION_SEMANTICS_DEFAULT );
944+ }
945+ else {
946+ // We can use the post alloc fast path if we're using Immix bump pointer allocator
947+ mmtk_post_alloc_fast_immix (objspace , ractor_cache , (uintptr_t )alloc_obj );
948+ }
926949
927950 // TODO: only add when object needs obj_free to be called
928951 mmtk_buffer_obj_free_candidate (ractor_cache , (VALUE )alloc_obj );
0 commit comments