Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
92 changes: 34 additions & 58 deletions gc/mmtk/mmtk.c
Original file line number Diff line number Diff line change
Expand Up @@ -114,21 +114,31 @@ RB_THREAD_LOCAL_SPECIFIER VALUE marking_parent_object;
#define MMTK_ALLOCATION_SEMANTICS_DEFAULT 0
#define MMTK_ALLOCATION_SEMANTICS_LOS 2

/* Functions called from the Rust binding (upcalls). They are not static so
* that the linker can resolve them from libmmtk_ruby.a, but they are hidden
* so that calls do not go through the PLT and so that LTO can inline them
* into their Rust callers. */
#ifdef __GNUC__
# define RB_MMTK_UPCALL __attribute__((visibility("hidden")))
#else
# define RB_MMTK_UPCALL
#endif

static inline VALUE rb_mmtk_call_object_closure(VALUE obj, bool pin);

static void
RB_MMTK_UPCALL void
rb_mmtk_init_gc_worker_thread(MMTk_VMWorkerThread gc_thread_tls)
{
rb_mmtk_gc_thread_tls = gc_thread_tls;
}

static bool
RB_MMTK_UPCALL bool
rb_mmtk_is_mutator(void)
{
return ruby_native_thread_p();
}

static void
RB_MMTK_UPCALL void
rb_mmtk_stop_the_world(void)
{
struct objspace *objspace = rb_gc_get_objspace();
Expand All @@ -147,7 +157,7 @@ rb_mmtk_stop_the_world(void)
}
}

static void
RB_MMTK_UPCALL void
rb_mmtk_resume_mutators(bool current_gc_may_move)
{
struct objspace *objspace = rb_gc_get_objspace();
Expand All @@ -169,7 +179,7 @@ rb_mmtk_resume_mutators(bool current_gc_may_move)

static void mmtk_flush_obj_free_buffer(struct MMTk_ractor_cache *cache);

static void
RB_MMTK_UPCALL void
rb_mmtk_block_for_gc(MMTk_VMMutatorThread mutator)
{
struct objspace *objspace = rb_gc_get_objspace();
Expand Down Expand Up @@ -233,26 +243,26 @@ rb_mmtk_block_for_gc(MMTk_VMMutatorThread mutator)
RB_GC_VM_UNLOCK(lock_lev);
}

static void
RB_MMTK_UPCALL void
rb_mmtk_before_updating_jit_code(void)
{
rb_gc_before_updating_jit_code();
}

static void
RB_MMTK_UPCALL void
rb_mmtk_after_updating_jit_code(void)
{
rb_gc_after_updating_jit_code();
}

static size_t
RB_MMTK_UPCALL size_t
rb_mmtk_number_of_mutators(void)
{
struct objspace *objspace = rb_gc_get_objspace();
return objspace->live_ractor_cache_count;
}

static void
RB_MMTK_UPCALL void
rb_mmtk_get_mutators(void (*visit_mutator)(MMTk_Mutator *mutator, void *data), void *data)
{
struct objspace *objspace = rb_gc_get_objspace();
Expand All @@ -263,7 +273,7 @@ rb_mmtk_get_mutators(void (*visit_mutator)(MMTk_Mutator *mutator, void *data), v
}
}

static void
RB_MMTK_UPCALL void
rb_mmtk_scan_gc_roots(void)
{
struct objspace *objspace = rb_gc_get_objspace();
Expand All @@ -279,7 +289,7 @@ pin_value(st_data_t key, st_data_t value, st_data_t data)
return ST_CONTINUE;
}

static void
RB_MMTK_UPCALL void
rb_mmtk_scan_objspace(void)
{
struct objspace *objspace = rb_gc_get_objspace();
Expand All @@ -304,7 +314,7 @@ rb_mmtk_scan_objspace(void)
}
}

static void
RB_MMTK_UPCALL void
rb_mmtk_move_obj_during_marking(MMTk_ObjectReference from, MMTk_ObjectReference to)
{
rb_gc_move_obj_during_marking((VALUE)from, (VALUE)to);
Expand All @@ -320,13 +330,13 @@ rb_mmtk_move_obj_during_marking(MMTk_ObjectReference from, MMTk_ObjectReference
}
}

static size_t
RB_MMTK_UPCALL size_t
rb_mmtk_obj_optimal_size(MMTk_ObjectReference obj)
{
return rb_gc_obj_optimal_size((VALUE)obj);
}

static void
RB_MMTK_UPCALL void
rb_mmtk_update_object_references(MMTk_ObjectReference mmtk_object)
{
VALUE object = (VALUE)mmtk_object;
Expand All @@ -338,15 +348,15 @@ rb_mmtk_update_object_references(MMTk_ObjectReference mmtk_object)
}
}

static void
RB_MMTK_UPCALL void
rb_mmtk_call_gc_mark_children(MMTk_ObjectReference object)
{
marking_parent_object = (VALUE)object;
rb_gc_mark_children(rb_gc_get_objspace(), (VALUE)object);
marking_parent_object = 0;
}

static void
RB_MMTK_UPCALL void
rb_mmtk_handle_weak_references(MMTk_ObjectReference mmtk_object, bool moving)
{
VALUE object = (VALUE)mmtk_object;
Expand All @@ -362,7 +372,7 @@ rb_mmtk_handle_weak_references(MMTk_ObjectReference mmtk_object, bool moving)
marking_parent_object = 0;
}

static void
RB_MMTK_UPCALL void
rb_mmtk_call_obj_free(MMTk_ObjectReference object)
{
VALUE obj = (VALUE)object;
Expand All @@ -383,7 +393,7 @@ rb_mmtk_call_obj_free(MMTk_ObjectReference object)
#endif
}

static size_t
RB_MMTK_UPCALL size_t
rb_mmtk_vm_live_bytes(void)
{
return 0;
Expand Down Expand Up @@ -438,7 +448,7 @@ rb_mmtk_update_finalizer_table_replace_i(st_data_t *key, st_data_t *value, st_da
return ST_CONTINUE;
}

static void
RB_MMTK_UPCALL void
rb_mmtk_update_finalizer_table(void)
{
struct objspace *objspace = rb_gc_get_objspace();
Expand All @@ -451,7 +461,7 @@ rb_mmtk_update_finalizer_table(void)
);
}

static int
RB_MMTK_UPCALL int
rb_mmtk_global_tables_count(void)
{
return RB_GC_VM_WEAK_TABLE_COUNT;
Expand Down Expand Up @@ -483,7 +493,7 @@ rb_mmtk_update_global_tables_replace_i(VALUE *ptr, void *data)
return ST_CONTINUE;
}

static void
RB_MMTK_UPCALL void
rb_mmtk_update_global_tables(int table, bool moving)
{
MMTK_ASSERT(table < RB_GC_VM_WEAK_TABLE_COUNT);
Expand All @@ -497,14 +507,6 @@ rb_mmtk_update_global_tables(int table, bool moving)
);
}

static bool
rb_mmtk_special_const_p(MMTk_ObjectReference object)
{
VALUE obj = (VALUE)object;

return RB_SPECIAL_CONST_P(obj);
}

RBIMPL_ATTR_FORMAT(RBIMPL_PRINTF_FORMAT, 1, 2)
RBIMPL_ATTR_NORETURN()
static void
Expand Down Expand Up @@ -532,46 +534,20 @@ rb_mmtk_gc_thread_bug(const char *msg, ...)
}

RBIMPL_ATTR_NORETURN()
static void
RB_MMTK_UPCALL void
rb_mmtk_gc_thread_panic_handler(void)
{
rb_mmtk_gc_thread_bug("MMTk GC thread panicked");
}

RBIMPL_ATTR_NORETURN()
static void
RB_MMTK_UPCALL void
rb_mmtk_mutator_thread_panic_handler(void)
{
rb_bug("Ruby mutator thread panicked");
}

// Bootup
MMTk_RubyUpcalls ruby_upcalls = {
rb_mmtk_init_gc_worker_thread,
rb_mmtk_is_mutator,
rb_mmtk_stop_the_world,
rb_mmtk_resume_mutators,
rb_mmtk_block_for_gc,
rb_mmtk_before_updating_jit_code,
rb_mmtk_after_updating_jit_code,
rb_mmtk_number_of_mutators,
rb_mmtk_get_mutators,
rb_mmtk_scan_gc_roots,
rb_mmtk_scan_objspace,
rb_mmtk_move_obj_during_marking,
rb_mmtk_obj_optimal_size,
rb_mmtk_update_object_references,
rb_mmtk_call_gc_mark_children,
rb_mmtk_handle_weak_references,
rb_mmtk_call_obj_free,
rb_mmtk_vm_live_bytes,
rb_mmtk_update_global_tables,
rb_mmtk_global_tables_count,
rb_mmtk_update_finalizer_table,
rb_mmtk_special_const_p,
rb_mmtk_mutator_thread_panic_handler,
rb_mmtk_gc_thread_panic_handler,
};

// Use max 80% of the available memory by default for MMTk
#define RB_MMTK_HEAP_LIMIT_PERC 80
Expand Down Expand Up @@ -603,7 +579,7 @@ rb_gc_impl_objspace_alloc(void)
MMTk_RubyBindingOptions binding_options = {
.suffix_size = 0,
};
mmtk_init_binding(builder, &binding_options, &ruby_upcalls);
mmtk_init_binding(builder, &binding_options);
the_objspace = calloc(1, sizeof(struct objspace));
}

Expand Down
88 changes: 53 additions & 35 deletions gc/mmtk/mmtk.h
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,12 @@ typedef struct MMTk_RubyBindingOptions {
size_t suffix_size;
} MMTk_RubyBindingOptions;

typedef struct MMTk_RawVecOfObjRef {
MMTk_ObjectReference *ptr;
size_t len;
size_t capa;
} MMTk_RawVecOfObjRef;

typedef MMTk_ObjectReference (*MMTk_ObjectClosureFunction)(void*, void*, MMTk_ObjectReference, bool);

typedef struct MMTk_ObjectClosure {
Expand All @@ -55,48 +61,14 @@ typedef struct MMTk_GCThreadTLS {
struct MMTk_ObjectClosure object_closure;
} MMTk_GCThreadTLS;

typedef struct MMTk_RubyUpcalls {
void (*init_gc_worker_thread)(struct MMTk_GCThreadTLS *gc_worker_tls);
bool (*is_mutator)(void);
void (*stop_the_world)(void);
void (*resume_mutators)(bool gc_may_move);
void (*block_for_gc)(MMTk_VMMutatorThread tls);
void (*before_updating_jit_code)(void);
void (*after_updating_jit_code)(void);
size_t (*number_of_mutators)(void);
void (*get_mutators)(void (*visit_mutator)(MMTk_Mutator*, void*), void *data);
void (*scan_gc_roots)(void);
void (*scan_objspace)(void);
void (*move_obj_during_marking)(MMTk_ObjectReference from, MMTk_ObjectReference to);
size_t (*obj_optimal_size)(MMTk_ObjectReference object);
void (*update_object_references)(MMTk_ObjectReference object);
void (*call_gc_mark_children)(MMTk_ObjectReference object);
void (*handle_weak_references)(MMTk_ObjectReference object, bool moving);
void (*call_obj_free)(MMTk_ObjectReference object);
size_t (*vm_live_bytes)(void);
void (*update_global_tables)(int tbl_idx, bool moving);
int (*global_tables_count)(void);
void (*update_finalizer_table)(void);
bool (*special_const_p)(MMTk_ObjectReference object);
void (*mutator_thread_panic_handler)(void);
void (*gc_thread_panic_handler)(void);
} MMTk_RubyUpcalls;

typedef struct MMTk_RawVecOfObjRef {
MMTk_ObjectReference *ptr;
size_t len;
size_t capa;
} MMTk_RawVecOfObjRef;

bool mmtk_is_live_object(MMTk_ObjectReference object);

bool mmtk_is_reachable(MMTk_ObjectReference object);

MMTk_Builder *mmtk_builder_default(void);

void mmtk_init_binding(MMTk_Builder *builder,
const struct MMTk_RubyBindingOptions *binding_options,
const struct MMTk_RubyUpcalls *upcalls);
const struct MMTk_RubyBindingOptions *binding_options);

size_t mmtk_get_vo_bit_log_region_size(void);

Expand Down Expand Up @@ -181,4 +153,50 @@ size_t mmtk_heap_max(void);

bool mmtk_is_mmtk_object(MMTk_Address addr);

extern void rb_mmtk_init_gc_worker_thread(struct MMTk_GCThreadTLS *gc_worker_tls);

extern bool rb_mmtk_is_mutator(void);

extern void rb_mmtk_stop_the_world(void);

extern void rb_mmtk_resume_mutators(bool gc_may_move);

extern void rb_mmtk_block_for_gc(MMTk_VMMutatorThread tls);

extern void rb_mmtk_before_updating_jit_code(void);

extern void rb_mmtk_after_updating_jit_code(void);

extern size_t rb_mmtk_number_of_mutators(void);

extern void rb_mmtk_get_mutators(void (*visit_mutator)(MMTk_Mutator*, void*), void *data);

extern void rb_mmtk_scan_gc_roots(void);

extern void rb_mmtk_scan_objspace(void);

extern void rb_mmtk_move_obj_during_marking(MMTk_ObjectReference from, MMTk_ObjectReference to);

extern size_t rb_mmtk_obj_optimal_size(MMTk_ObjectReference object);

extern void rb_mmtk_update_object_references(MMTk_ObjectReference object);

extern void rb_mmtk_call_gc_mark_children(MMTk_ObjectReference object);

extern void rb_mmtk_handle_weak_references(MMTk_ObjectReference object, bool moving);

extern void rb_mmtk_call_obj_free(MMTk_ObjectReference object);

extern size_t rb_mmtk_vm_live_bytes(void);

extern void rb_mmtk_update_global_tables(int tbl_idx, bool moving);

extern int rb_mmtk_global_tables_count(void);

extern void rb_mmtk_update_finalizer_table(void);

extern void rb_mmtk_mutator_thread_panic_handler(void);

extern void rb_mmtk_gc_thread_panic_handler(void);

#endif /* MMTK_H */
Loading
Loading