[ruby-core:85940] [Ruby trunk Bug#14578] Forking a child process inside of a mutex crashes the ruby interpreter

From: ben.govero@...
Date: 2018-03-05 19:45:01 UTC
List: ruby-core #85940
Issue #14578 has been reported by bengovero (Ben Govero).

----------------------------------------
Bug #14578: Forking a child process inside of a mutex crashes the ruby interpreter
https://bugs.ruby-lang.org/issues/14578

* Author: bengovero (Ben Govero)
* Status: Open
* Priority: Normal
* Assignee: 
* Target version: 
* ruby -v: 2.5.0
* Backport: 2.3: UNKNOWN, 2.4: UNKNOWN, 2.5: UNKNOWN
----------------------------------------
OS: Mac OS X 10.13.3 (High Sierra)
Affects ruby versions 2.5.0 and 2.6.0preview1

Issue **not** present in 2.4.1

Consider the following script. I contrived it as an experiment for a more complicated project. We have a resource that we want to synchronize access to, but we want to fork the process when actually using the resource. This script works in 2.4.1, but not in 2.5.0 or beyond.

```
class Synchronizer

  def initialize
    @mutex = Mutex.new
  end

  def use(&block)
    @mutex.synchronize do
      Process.fork do
        block.call
      end

      Process.wait
    end
  end

end

@s = Synchronizer.new

5.times do |i|
  Thread.new do
    @s.use do
      puts "block #{i}"
    end
  end
end

sleep 10
```

The error I get when the interpreter crashes is: `[BUG] unexpected THREAD_KILLED`

Is this a crazy implementation? Or a real bug?

---Files--------------------------------
ruby_2018-03-05-133827_bens-mac.crash (36.3 KB)
ruby_2018-03-05-133827-1_bens-mac.crash (36.3 KB)
ruby_2018-03-05-133827-2_bens-mac.crash (36.3 KB)


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

Unsubscribe: <mailto:ruby-core-request@ruby-lang.org?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>

In This Thread

Prev Next