From 4e2087b25f94079c94ff4ad6ea97940fb3ce5916 Mon Sep 17 00:00:00 2001 From: Kunshan Wang Date: Thu, 18 Jan 2024 16:19:50 +0800 Subject: [PATCH 1/6] Remove coordinator thread --- internal/mmtk.h | 2 -- 1 file changed, 2 deletions(-) diff --git a/internal/mmtk.h b/internal/mmtk.h index be80b27197500a..0159a4d8eebcba 100644 --- a/internal/mmtk.h +++ b/internal/mmtk.h @@ -26,8 +26,6 @@ typedef uint32_t MMTk_AllocationSemantics; #define MMTK_MIN_OBJ_ALIGN 8 -#define MMTK_GC_THREAD_KIND_CONTROLLER 0 - #define MMTK_GC_THREAD_KIND_WORKER 1 typedef struct RubyBindingOptions { From abc97a3664f5a1e7126b4687b67de7f672eee818 Mon Sep 17 00:00:00 2001 From: Kunshan Wang Date: Thu, 18 Jan 2024 16:19:08 +0800 Subject: [PATCH 2/6] Forking support --- internal/mmtk.h | 2 ++ internal/mmtk_support.h | 4 ++++ mmtk_support.c | 14 ++++++++++++++ process.c | 2 ++ 4 files changed, 22 insertions(+) diff --git a/internal/mmtk.h b/internal/mmtk.h index 0159a4d8eebcba..e094dc110c03c9 100644 --- a/internal/mmtk.h +++ b/internal/mmtk.h @@ -143,6 +143,8 @@ bool mmtk_will_never_move(MMTk_ObjectReference object); void mmtk_initialize_collection(MMTk_VMThread tls); +void mmtk_uninitialize_collection(void); + void mmtk_enable_collection(void); void mmtk_disable_collection(void); diff --git a/internal/mmtk_support.h b/internal/mmtk_support.h index 0690b5bc8272e4..a60da0d7fef4f4 100644 --- a/internal/mmtk_support.h +++ b/internal/mmtk_support.h @@ -101,6 +101,10 @@ VALUE* rb_mmtk_objbuf_to_elems(rb_mmtk_objbuf_t* objbuf); void rb_mmtk_pin_array_buffer(VALUE array, volatile VALUE *stack_slot); +// Forking support +void rb_mmtk_shutdown_gc_threads(void); +void rb_mmtk_respawn_gc_threads(void); + // MMTk-specific Ruby module (GC::MMTk) void rb_mmtk_define_gc_mmtk_module(void); VALUE rb_mmtk_plan_name(VALUE _); diff --git a/mmtk_support.c b/mmtk_support.c index 75ea811eabadf5..a4cdbcce66b9d7 100644 --- a/mmtk_support.c +++ b/mmtk_support.c @@ -1097,6 +1097,20 @@ rb_mmtk_pin_array_buffer(VALUE array, volatile VALUE *stack_slot) } } +//////////////////////////////////////////////////////////////////////////////// +// Forking support +//////////////////////////////////////////////////////////////////////////////// +void +rb_mmtk_shutdown_gc_threads(void) +{ + mmtk_uninitialize_collection(); +} + +void rb_mmtk_respawn_gc_threads(void) +{ + mmtk_initialize_collection(GET_THREAD()); +} + //////////////////////////////////////////////////////////////////////////////// // MMTk-specific Ruby module (GC::MMTk) //////////////////////////////////////////////////////////////////////////////// diff --git a/process.c b/process.c index 094ccf16855126..9e8da8d26aeb6d 100644 --- a/process.c +++ b/process.c @@ -1677,11 +1677,13 @@ static void before_fork_ruby(void) { before_exec(); + rb_mmtk_shutdown_gc_threads(); } static void after_fork_ruby(rb_pid_t pid) { + rb_mmtk_respawn_gc_threads(); rb_threadptr_pending_interrupt_clear(GET_THREAD()); if (pid == 0) { // child From 97d04ff5f648d03814ef5028f07e5c94dd5b5c0c Mon Sep 17 00:00:00 2001 From: Kunshan Wang Date: Fri, 19 Jan 2024 18:00:27 +0800 Subject: [PATCH 3/6] MMTk-only GC worker stop/resume. Only call functions before/after fork() to stop/resume MMTk GC workers when MMTk is enabled. --- process.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/process.c b/process.c index 9e8da8d26aeb6d..1fe9c49ecad980 100644 --- a/process.c +++ b/process.c @@ -1677,13 +1677,21 @@ static void before_fork_ruby(void) { before_exec(); - rb_mmtk_shutdown_gc_threads(); +#if USE_MMTK + if (rb_mmtk_enabled_p()) { + rb_mmtk_shutdown_gc_threads(); + } +#endif } static void after_fork_ruby(rb_pid_t pid) { - rb_mmtk_respawn_gc_threads(); +#if USE_MMTK + if (rb_mmtk_enabled_p()) { + rb_mmtk_respawn_gc_threads(); + } +#endif rb_threadptr_pending_interrupt_clear(GET_THREAD()); if (pid == 0) { // child From 58f0e2d2bcbe50530fcc1cbbfa2458f801d16bc7 Mon Sep 17 00:00:00 2001 From: Kunshan Wang Date: Fri, 19 Jan 2024 18:01:35 +0800 Subject: [PATCH 4/6] Revert "Temporarily disable fork" This reverts commit 36b134be02af248ffab498f981eff819c303f814. --- process.c | 8 -------- 1 file changed, 8 deletions(-) diff --git a/process.c b/process.c index 1fe9c49ecad980..f7b4cf19120d5e 100644 --- a/process.c +++ b/process.c @@ -9155,15 +9155,7 @@ InitVM_process(void) #endif rb_define_singleton_method(rb_mProcess, "exec", f_exec, -1); -#if USE_MMTK - // FIXME: MMTk currently doesn't support forking, so Process will not respond to :fork for not. - // We should add necessary mechanism to mmtk-core in order to support forking. - if (!rb_mmtk_enabled_p()) { -#endif rb_define_singleton_method(rb_mProcess, "fork", rb_f_fork, 0); -#if USE_MMTK - } -#endif rb_define_singleton_method(rb_mProcess, "spawn", rb_f_spawn, -1); rb_define_singleton_method(rb_mProcess, "exit!", rb_f_exit_bang, -1); rb_define_singleton_method(rb_mProcess, "exit", f_exit, -1); From 4085f84ea37b51320f90e70603be3cd8d26a7ce6 Mon Sep 17 00:00:00 2001 From: Kunshan Wang Date: Mon, 5 Feb 2024 17:29:18 +0800 Subject: [PATCH 5/6] Replace uninitialize_collection with prepare/after fork. --- internal/mmtk.h | 4 +++- mmtk_support.c | 4 ++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/internal/mmtk.h b/internal/mmtk.h index e094dc110c03c9..e9dbadf6f18f25 100644 --- a/internal/mmtk.h +++ b/internal/mmtk.h @@ -143,7 +143,9 @@ bool mmtk_will_never_move(MMTk_ObjectReference object); void mmtk_initialize_collection(MMTk_VMThread tls); -void mmtk_uninitialize_collection(void); +void mmtk_prepare_to_fork(void); + +void mmtk_after_fork(MMTk_VMThread tls); void mmtk_enable_collection(void); diff --git a/mmtk_support.c b/mmtk_support.c index 798d1a916fda72..9fbede33196830 100644 --- a/mmtk_support.c +++ b/mmtk_support.c @@ -1104,12 +1104,12 @@ rb_mmtk_pin_array_buffer(VALUE array, volatile VALUE *stack_slot) void rb_mmtk_shutdown_gc_threads(void) { - mmtk_uninitialize_collection(); + mmtk_prepare_to_fork(); } void rb_mmtk_respawn_gc_threads(void) { - mmtk_initialize_collection(GET_THREAD()); + mmtk_after_fork(GET_THREAD()); } //////////////////////////////////////////////////////////////////////////////// From 2b04d0c6d06c2d94fa6e9ced0e4395f790137464 Mon Sep 17 00:00:00 2001 From: Kunshan Wang Date: Mon, 5 Feb 2024 23:52:09 +0800 Subject: [PATCH 6/6] Disable a test about number of threads. --- test/ruby/test_process.rb | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/test/ruby/test_process.rb b/test/ruby/test_process.rb index 8de4b80d64e579..37249a0982c295 100644 --- a/test/ruby/test_process.rb +++ b/test/ruby/test_process.rb @@ -1930,7 +1930,8 @@ def test_daemon_detached end end - if File.directory?("/proc/self/task") && /netbsd[a-z]*[1-6]/ !~ RUBY_PLATFORM + # Note: MMTk has many GC worker threads, and they will be visible in /proc/self/task. + if File.directory?("/proc/self/task") && /netbsd[a-z]*[1-6]/ !~ RUBY_PLATFORM && !defined?(GC::MMTk) def test_daemon_no_threads pid, data = IO.popen("-", "r+") do |f| break f.pid, f.readlines if f @@ -1941,7 +1942,7 @@ def test_daemon_no_threads assert_include(1..2, data.size, bug4920) assert_not_include(data.map(&:to_i), pid) end - else # darwin + else # darwin or MMTk def test_daemon_no_threads data = EnvUtil.timeout(3) do IO.popen("-") do |f|