[ruby-core:62493] [ruby-trunk - Bug #9751] Process.wait does not work correctly in a thread

From: normalperson@...
Date: 2014-05-10 02:58:28 UTC
List: ruby-core #62493
Issue #9751 has been updated by Eric Wong.


 The following one-liner fixes the case where "exit" is called.
 However, when "exit"/"exit!" is omitted entirely, it still hangs.
 I am out of time for today...
 
 	--- a/thread.c
 	+++ b/thread.c
 	@@ -3799,6 +3799,7 @@ rb_thread_atfork(void)
 	 {
 	     rb_thread_atfork_internal(terminate_atfork_i);
 	     GET_THREAD()->join_list = NULL;
 	+    GET_THREAD()->tag = NULL;
 	 
 	     /* We don't want reproduce CVE-2003-0900. */
 	     rb_reset_random_seed();
 
 (indented so I hope it looks OK in redmine)

----------------------------------------
Bug #9751: Process.wait does not work correctly in a thread
https://bugs.ruby-lang.org/issues/9751#change-46655

* Author: Sam Saffron
* Status: Open
* Priority: Normal
* Assignee: 
* Category: 
* Target version: 
* ruby -v: 1.9, 2.0, 2.1, 2.2
* Backport: 2.0.0: UNKNOWN, 2.1: UNKNOWN
----------------------------------------
The following code fails under Ruby 1.9+, used to work on 1.8 with green threads

```
def test
  if pid = fork
    puts "child pid is #{pid} waiting ..."
    begin
      Process.wait(pid)
      puts "child exited"
    rescue => e
      p e
    end
  else
    sleep 3
    puts "exiting child"
    exit 0
  end
end
 
# this works as expected
test
 
puts "testing in thread"
 
# this will hang
Thread.new do
  test
end.join
```

Additionally on SIGINT I am seeing a zombie + [BUG] pthread_mutex_lock: Invalid argument (EINVAL)



-- 
https://bugs.ruby-lang.org/

In This Thread

Prev Next