aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--bootstraptest/test_ractor.rb18
-rw-r--r--common.mk4
-rw-r--r--signal.c6
3 files changed, 28 insertions, 0 deletions
diff --git a/bootstraptest/test_ractor.rb b/bootstraptest/test_ractor.rb
index 81bea95e01..b13ecbe3e9 100644
--- a/bootstraptest/test_ractor.rb
+++ b/bootstraptest/test_ractor.rb
@@ -1133,6 +1133,24 @@ assert_equal '[true, false]', %q{
}.take
}
+# Can not trap with not isolated Proc on non-main ractor
+assert_equal '[:ok, :ok]', %q{
+ a = []
+ Ractor.new{
+ trap(:INT){p :ok}
+ }.take
+ a << :ok
+
+ begin
+ Ractor.new{
+ s = 'str'
+ trap(:INT){p s}
+ }.take
+ rescue => Ractor::RemoteError
+ a << :ok
+ end
+}
+
###
### Synchronization tests
###
diff --git a/common.mk b/common.mk
index 1841e84691..249e81a4ed 100644
--- a/common.mk
+++ b/common.mk
@@ -12692,6 +12692,7 @@ signal.$(OBJEXT): {$(VPATH)}defines.h
signal.$(OBJEXT): {$(VPATH)}encoding.h
signal.$(OBJEXT): {$(VPATH)}eval_intern.h
signal.$(OBJEXT): {$(VPATH)}id.h
+signal.$(OBJEXT): {$(VPATH)}id_table.h
signal.$(OBJEXT): {$(VPATH)}intern.h
signal.$(OBJEXT): {$(VPATH)}internal.h
signal.$(OBJEXT): {$(VPATH)}internal/anyargs.h
@@ -12839,6 +12840,8 @@ signal.$(OBJEXT): {$(VPATH)}missing.h
signal.$(OBJEXT): {$(VPATH)}node.h
signal.$(OBJEXT): {$(VPATH)}onigmo.h
signal.$(OBJEXT): {$(VPATH)}oniguruma.h
+signal.$(OBJEXT): {$(VPATH)}ractor.h
+signal.$(OBJEXT): {$(VPATH)}ractor_core.h
signal.$(OBJEXT): {$(VPATH)}ruby_assert.h
signal.$(OBJEXT): {$(VPATH)}ruby_atomic.h
signal.$(OBJEXT): {$(VPATH)}signal.c
@@ -12847,6 +12850,7 @@ signal.$(OBJEXT): {$(VPATH)}subst.h
signal.$(OBJEXT): {$(VPATH)}thread_$(THREAD_MODEL).h
signal.$(OBJEXT): {$(VPATH)}thread_native.h
signal.$(OBJEXT): {$(VPATH)}vm_core.h
+signal.$(OBJEXT): {$(VPATH)}vm_debug.h
signal.$(OBJEXT): {$(VPATH)}vm_opts.h
sprintf.$(OBJEXT): $(hdrdir)/ruby.h
sprintf.$(OBJEXT): $(hdrdir)/ruby/ruby.h
diff --git a/signal.c b/signal.c
index 08de1bccdb..91521fe807 100644
--- a/signal.c
+++ b/signal.c
@@ -43,6 +43,7 @@
#include "internal/thread.h"
#include "ruby_atomic.h"
#include "vm_core.h"
+#include "ractor_core.h"
#ifdef NEED_RUBY_ATOMIC_OPS
rb_atomic_t
@@ -1410,6 +1411,11 @@ sig_trap(int argc, VALUE *argv, VALUE _)
func = trap_handler(&cmd, sig);
}
+ if (rb_obj_is_proc(cmd) &&
+ !rb_ractor_main_p() && !rb_ractor_shareable_p(cmd)) {
+ cmd = rb_proc_isolate(cmd);
+ }
+
return trap(sig, func, cmd);
}