Skip to content

Commit cbe1a1a

Browse files
committed
Initial implementation of Mark & Sweep
1 parent becfabf commit cbe1a1a

16 files changed

+806
-274
lines changed

Diff for: gc.c

+56-8
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,12 @@ rb_gc_get_objspace(void)
190190
return GET_VM()->objspace;
191191
}
192192

193+
void *
194+
rb_gc_get_ractor_newobj_cache(void)
195+
{
196+
return GET_RACTOR()->newobj_cache;
197+
}
198+
193199
void
194200
rb_gc_ractor_newobj_cache_foreach(void (*func)(void *cache, void *data), void *data)
195201
{
@@ -324,6 +330,41 @@ rb_gc_rebuild_shape(VALUE obj, size_t size_pool_id)
324330
return (uint32_t)rb_shape_id(new_shape);
325331
}
326332

333+
struct st_table *generic_ivtbl_get(void);
334+
335+
struct st_table *
336+
rb_gc_get_generic_ivar_table(void)
337+
{
338+
return generic_ivtbl_get();
339+
}
340+
341+
struct st_table *
342+
rb_gc_get_frozen_strings_table(void)
343+
{
344+
return rb_vm_fstring_table();
345+
}
346+
347+
extern rb_symbols_t ruby_global_symbols;
348+
#define global_symbols ruby_global_symbols
349+
350+
struct st_table *
351+
rb_gc_get_global_symbols_table(void)
352+
{
353+
return global_symbols.str_sym;
354+
}
355+
356+
struct st_table *
357+
rb_gc_get_overloaded_cme_table(void)
358+
{
359+
return GET_VM()->overloaded_cme_table;
360+
}
361+
362+
struct st_table *
363+
rb_gc_get_ci_table(void)
364+
{
365+
return GET_VM()->ci_table;
366+
}
367+
327368
void rb_vm_update_references(void *ptr);
328369

329370
#define rb_setjmp(env) RUBY_SETJMP(env)
@@ -577,7 +618,7 @@ typedef struct gc_function_map {
577618
void *(*objspace_alloc)(void);
578619
void (*objspace_init)(void *objspace_ptr);
579620
void (*objspace_free)(void *objspace_ptr);
580-
void *(*ractor_cache_alloc)(void *objspace_ptr);
621+
void *(*ractor_cache_alloc)(void *objspace_ptr, void *ractor);
581622
void (*ractor_cache_free)(void *objspace_ptr, void *cache);
582623
void (*set_params)(void *objspace_ptr);
583624
void (*init)(void);
@@ -2421,8 +2462,7 @@ mark_const_table_i(VALUE value, void *objspace)
24212462
void
24222463
rb_gc_mark_roots(void *objspace, const char **categoryp)
24232464
{
2424-
rb_execution_context_t *ec = GET_EC();
2425-
rb_vm_t *vm = rb_ec_vm_ptr(ec);
2465+
rb_vm_t *vm = GET_VM();
24262466

24272467
#define MARK_CHECKPOINT(category) do { \
24282468
if (categoryp) *categoryp = category; \
@@ -2432,9 +2472,6 @@ rb_gc_mark_roots(void *objspace, const char **categoryp)
24322472
rb_vm_mark(vm);
24332473
if (vm->self) rb_gc_impl_mark(objspace, vm->self);
24342474

2435-
MARK_CHECKPOINT("machine_context");
2436-
mark_current_machine_context(objspace, ec);
2437-
24382475
MARK_CHECKPOINT("end_proc");
24392476
rb_mark_end_proc();
24402477

@@ -2451,6 +2488,17 @@ rb_gc_mark_roots(void *objspace, const char **categoryp)
24512488
#endif
24522489

24532490
MARK_CHECKPOINT("finish");
2491+
}
2492+
2493+
void
2494+
rb_gc_mark_thread_roots(void *objspace, void *ractor, const char **categoryp)
2495+
{
2496+
if (ractor == NULL) ractor = GET_RACTOR();
2497+
2498+
rb_execution_context_t *ec = ((rb_ractor_t *)ractor)->threads.running_ec;
2499+
2500+
MARK_CHECKPOINT("machine_context");
2501+
mark_current_machine_context(objspace, ec);
24542502
#undef MARK_CHECKPOINT
24552503
}
24562504

@@ -2736,9 +2784,9 @@ rb_obj_gc_flags(VALUE obj, ID* flags, size_t max)
27362784
/* GC */
27372785

27382786
void *
2739-
rb_gc_ractor_cache_alloc(void)
2787+
rb_gc_ractor_cache_alloc(rb_ractor_t *ractor)
27402788
{
2741-
return rb_gc_impl_ractor_cache_alloc(rb_gc_get_objspace());
2789+
return rb_gc_impl_ractor_cache_alloc(rb_gc_get_objspace(), ractor);
27422790
}
27432791

27442792
void

Diff for: gc/default.c

+3-1
Original file line numberDiff line numberDiff line change
@@ -4839,6 +4839,8 @@ mark_roots(rb_objspace_t *objspace, const char **categoryp)
48394839
if (stress_to_class) rb_gc_mark(stress_to_class);
48404840

48414841
rb_gc_mark_roots(objspace, categoryp);
4842+
4843+
rb_gc_mark_thread_roots(objspace, NULL, categoryp);
48424844
}
48434845

48444846
static inline void
@@ -6450,7 +6452,7 @@ rb_gc_impl_obj_flags(void *objspace_ptr, VALUE obj, ID* flags, size_t max)
64506452
}
64516453

64526454
void *
6453-
rb_gc_impl_ractor_cache_alloc(void *objspace_ptr)
6455+
rb_gc_impl_ractor_cache_alloc(void *objspace_ptr, void *ractor)
64546456
{
64556457
rb_objspace_t *objspace = objspace_ptr;
64566458

Diff for: gc/gc.h

+7
Original file line numberDiff line numberDiff line change
@@ -26,12 +26,14 @@ void rb_gc_update_vm_references(void *objspace);
2626
void rb_gc_reachable_objects_from_callback(VALUE obj);
2727
void rb_gc_event_hook(VALUE obj, rb_event_flag_t event);
2828
void *rb_gc_get_objspace(void);
29+
void *rb_gc_get_ractor_newobj_cache(void);
2930
size_t rb_size_mul_or_raise(size_t x, size_t y, VALUE exc);
3031
void rb_gc_run_obj_finalizer(VALUE objid, long count, VALUE (*callback)(long i, void *data), void *data);
3132
void rb_gc_set_pending_interrupt(void);
3233
void rb_gc_unset_pending_interrupt(void);
3334
bool rb_gc_obj_free(void *objspace, VALUE obj);
3435
void rb_gc_mark_roots(void *objspace, const char **categoryp);
36+
void rb_gc_mark_thread_roots(void *objspace, void *ractor, const char **categoryp);
3537
void rb_gc_ractor_newobj_cache_foreach(void (*func)(void *cache, void *data), void *data);
3638
bool rb_gc_multi_ractor_p(void);
3739
void rb_objspace_reachable_objects_from_root(void (func)(const char *category, VALUE, void *), void *passing_data);
@@ -43,6 +45,11 @@ uint32_t rb_gc_get_shape(VALUE obj);
4345
void rb_gc_set_shape(VALUE obj, uint32_t shape_id);
4446
uint32_t rb_gc_rebuild_shape(VALUE obj, size_t size_pool_id);
4547
size_t rb_obj_memsize_of(VALUE obj);
48+
struct st_table *rb_gc_get_generic_ivar_table(void);
49+
struct st_table *rb_gc_get_frozen_strings_table(void);
50+
struct st_table *rb_gc_get_global_symbols_table(void);
51+
struct st_table *rb_gc_get_overloaded_cme_table(void);
52+
struct st_table *rb_gc_get_ci_table(void);
4653
RUBY_SYMBOL_EXPORT_END
4754

4855
void rb_ractor_finish_marking(void);

Diff for: gc/gc_impl.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
GC_IMPL_FN void *rb_gc_impl_objspace_alloc(void);
2929
GC_IMPL_FN void rb_gc_impl_objspace_init(void *objspace_ptr);
3030
GC_IMPL_FN void rb_gc_impl_objspace_free(void *objspace_ptr);
31-
GC_IMPL_FN void *rb_gc_impl_ractor_cache_alloc(void *objspace_ptr);
31+
GC_IMPL_FN void *rb_gc_impl_ractor_cache_alloc(void *objspace_ptr, void *ractor);
3232
GC_IMPL_FN void rb_gc_impl_ractor_cache_free(void *objspace_ptr, void *cache);
3333
GC_IMPL_FN void rb_gc_impl_set_params(void *objspace_ptr);
3434
GC_IMPL_FN void rb_gc_impl_init(void);

0 commit comments

Comments
 (0)