From b3c53a8a885be8f5cc2b712798b0d2741c488ce4 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Sun, 7 Mar 2021 00:58:28 +0900 Subject: [PATCH] Make Ractor stdio belonging to the Ractor [Bug #17672] Defer making ractor stdio until ractor started. Before ractor started, created objects belong to the caller ractor instead of the created ractor. --- bootstraptest/test_ractor.rb | 12 ++++++++++++ ractor.c | 9 --------- thread.c | 9 +++++++++ 3 files changed, 21 insertions(+), 9 deletions(-) diff --git a/bootstraptest/test_ractor.rb b/bootstraptest/test_ractor.rb index 69f3337764..6299b50e3b 100644 --- a/bootstraptest/test_ractor.rb +++ b/bootstraptest/test_ractor.rb @@ -805,6 +805,18 @@ assert_equal 'ok', %q{ 'ok' } +# $stdin,out,err belong to Ractor +assert_equal 'ok', %q{ + r = Ractor.new do + $stdin.itself + $stdout.itself + $stderr.itself + 'ok' + end + + r.take +} + # $DEBUG, $VERBOSE are Ractor local assert_equal 'true', %q{ $DEBUG = true diff --git a/ractor.c b/ractor.c index 292a33b3e5..4cb7b5ad49 100644 --- a/ractor.c +++ b/ractor.c @@ -1583,11 +1583,6 @@ rb_ractor_main_setup(rb_vm_t *vm, rb_ractor_t *r, rb_thread_t *th) rb_ractor_living_threads_insert(r, th); } -// io.c -VALUE rb_io_prep_stdin(void); -VALUE rb_io_prep_stdout(void); -VALUE rb_io_prep_stderr(void); - static VALUE ractor_create(rb_execution_context_t *ec, VALUE self, VALUE loc, VALUE name, VALUE args, VALUE block) { @@ -1599,10 +1594,6 @@ ractor_create(rb_execution_context_t *ec, VALUE self, VALUE loc, VALUE name, VAL r->pub.id = ractor_next_id(); RUBY_DEBUG_LOG("r:%u", r->pub.id); - r->r_stdin = rb_io_prep_stdin(); - r->r_stdout = rb_io_prep_stdout(); - r->r_stderr = rb_io_prep_stderr(); - rb_ractor_t *cr = rb_ec_ractor_ptr(ec); r->verbose = cr->verbose; r->debug = cr->debug; diff --git a/thread.c b/thread.c index c600a8763b..f2dd417297 100644 --- a/thread.c +++ b/thread.c @@ -777,6 +777,11 @@ thread_do_start(rb_thread_t *th) void rb_ec_clear_current_thread_trace_func(const rb_execution_context_t *ec); +// io.c +VALUE rb_io_prep_stdin(void); +VALUE rb_io_prep_stdout(void); +VALUE rb_io_prep_stderr(void); + static int thread_start_func_2(rb_thread_t *th, VALUE *stack_start) { @@ -799,6 +804,10 @@ thread_start_func_2(rb_thread_t *th, VALUE *stack_start) RB_VM_LOCK(); { rb_vm_ractor_blocking_cnt_dec(th->vm, th->ractor, __FILE__, __LINE__); + rb_ractor_t *r = th->ractor; + r->r_stdin = rb_io_prep_stdin(); + r->r_stdout = rb_io_prep_stdout(); + r->r_stderr = rb_io_prep_stderr(); } RB_VM_UNLOCK(); }