Skip to content

Commit a3911b9

Browse files
committed
merge revision(s) 0402193: [Backport #19709]
Fix `Thread#join(timeout)` when running inside the fiber scheduler. (ruby#7903) --- test/fiber/test_thread.rb | 22 ++++++++++++++++++++++ thread.c | 5 +++++ 2 files changed, 27 insertions(+)
1 parent ea89527 commit a3911b9

File tree

3 files changed

+28
-1
lines changed

3 files changed

+28
-1
lines changed

test/fiber/test_thread.rb

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,28 @@ def test_thread_join
2020
assert_equal :done, thread.value
2121
end
2222

23+
def test_thread_join_timeout
24+
sleeper = nil
25+
26+
thread = Thread.new do
27+
scheduler = Scheduler.new
28+
Fiber.set_scheduler scheduler
29+
30+
Fiber.schedule do
31+
sleeper = Thread.new{sleep}
32+
sleeper.join(0.1)
33+
end
34+
35+
scheduler.run
36+
end
37+
38+
thread.join
39+
40+
assert_predicate sleeper, :alive?
41+
ensure
42+
sleeper&.kill
43+
end
44+
2345
def test_thread_join_implicit
2446
sleeping = false
2547
finished = false

thread.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1048,6 +1048,10 @@ thread_join_sleep(VALUE arg)
10481048

10491049
if (scheduler != Qnil) {
10501050
rb_fiber_scheduler_block(scheduler, target_th->self, p->timeout);
1051+
// Check if the target thread is finished after blocking:
1052+
if (thread_finished(target_th)) break;
1053+
// Otherwise, a timeout occurred:
1054+
else return Qfalse;
10511055
}
10521056
else if (!limit) {
10531057
th->status = THREAD_STOPPED_FOREVER;
@@ -1069,6 +1073,7 @@ thread_join_sleep(VALUE arg)
10691073

10701074
RUBY_DEBUG_LOG("interrupted target_th:%u status:%s", rb_th_serial(target_th), thread_status_name(target_th, TRUE));
10711075
}
1076+
10721077
return Qtrue;
10731078
}
10741079

version.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
# define RUBY_VERSION_MINOR RUBY_API_VERSION_MINOR
1212
#define RUBY_VERSION_TEENY 2
1313
#define RUBY_RELEASE_DATE RUBY_RELEASE_YEAR_STR"-"RUBY_RELEASE_MONTH_STR"-"RUBY_RELEASE_DAY_STR
14-
#define RUBY_PATCHLEVEL 97
14+
#define RUBY_PATCHLEVEL 98
1515

1616
#include "ruby/version.h"
1717
#include "ruby/internal/abi.h"

0 commit comments

Comments
 (0)