summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--process.c1
-rw-r--r--test/ruby/test_process.rb21
-rw-r--r--thread.c1
-rw-r--r--version.h2
4 files changed, 23 insertions, 2 deletions
diff --git a/process.c b/process.c
index 3b254ddecb..aff350331b 100644
--- a/process.c
+++ b/process.c
@@ -1682,7 +1682,6 @@ before_fork_ruby(void)
static void
after_fork_ruby(rb_pid_t pid)
{
- rb_threadptr_pending_interrupt_clear(GET_THREAD());
if (pid == 0) {
// child
clear_pid_cache();
diff --git a/test/ruby/test_process.rb b/test/ruby/test_process.rb
index 188ef75fae..d9804aaa57 100644
--- a/test/ruby/test_process.rb
+++ b/test/ruby/test_process.rb
@@ -2783,4 +2783,25 @@ EOS
assert_operator(GC.stat(:total_freed_pages), :>, 0)
end;
end
+
+ def test_handle_interrupt_with_fork
+ Thread.handle_interrupt(RuntimeError => :never) do
+ Thread.current.raise(RuntimeError, "Queued error")
+
+ assert_predicate Thread, :pending_interrupt?
+
+ pid = Process.fork do
+ if Thread.pending_interrupt?
+ exit 1
+ end
+ end
+
+ _, status = Process.waitpid2(pid)
+ assert_predicate status, :success?
+
+ assert_predicate Thread, :pending_interrupt?
+ end
+ rescue RuntimeError
+ # Ignore.
+ end if defined?(fork)
end
diff --git a/thread.c b/thread.c
index 79bad7ed98..e756238ba6 100644
--- a/thread.c
+++ b/thread.c
@@ -4701,6 +4701,7 @@ void
rb_thread_atfork(void)
{
rb_thread_t *th = GET_THREAD();
+ rb_threadptr_pending_interrupt_clear(th);
rb_thread_atfork_internal(th, terminate_atfork_i);
th->join_list = NULL;
rb_fiber_atfork(th);
diff --git a/version.h b/version.h
index 0b9e010a66..af291da045 100644
--- a/version.h
+++ b/version.h
@@ -11,7 +11,7 @@
# define RUBY_VERSION_MINOR RUBY_API_VERSION_MINOR
#define RUBY_VERSION_TEENY 1
#define RUBY_RELEASE_DATE RUBY_RELEASE_YEAR_STR"-"RUBY_RELEASE_MONTH_STR"-"RUBY_RELEASE_DAY_STR
-#define RUBY_PATCHLEVEL 65
+#define RUBY_PATCHLEVEL 66
#include "ruby/version.h"
#include "ruby/internal/abi.h"