[ruby-trunk - Bug #6911] Sync m#sync unlock で ThreadError が発生する場合がある

Issue #6911 has been updated by mrkn (Kenta M.).

わお、ごめんなさい。添付し忘れていたようです。更新しました。

以下にも貼ります。

diff --git a/lib/sync.rb b/lib/sync.rb
index bae05a4…05864c2 100644
— a/lib/sync.rb
+++ b/lib/sync.rb
@@ -147,7 +147,7 @@ module Sync_m
sync_upgrade_waiting.push [Thread.current,
sync_sh_locker[Thread.current]]
sync_sh_locker.delete(Thread.current)
else

  •        sync_waiting.push Thread.current
    
  •        sync_waiting.push Thread.current unless 
    

sync_waiting.include? Thread.current
end
@sync_mutex.sleep
end

Bug #6911: Sync_m#sync_unlock で ThreadError が発生する場合がある
https://bugs.ruby-lang.org/issues/6911#change-29017

Author: mrkn (Kenta M.)
Status: Open
Priority: Normal
Assignee:
Category: lib
Target version: 2.0.0
ruby -v: ruby 2.0.0dev (2012-08-23 trunk 36795) [x86_64-darwin11.4.0]

Sync_m#sync_unlock で ThreadError が発生する場合があります。
原因は Sync_m#sync_lock が同一スレッドを複数回 sync_waiting 配列に push してしまうからです。

同一スレッドが多重に sync_waiting 配列に入っていると、sync_unlock の中で何度もそのスレッドに対して
Thread#run が呼ばれます。
すると、1回目の Thread#run でそのスレッドが終了した場合、2回目の Thread#run で ThreadError が発生します。

sync_waiting に同一スレッドが複数回 push された状態を再現するコードを gist に置きました。

この gist に添付されてる test を実行すると、以下のような結果が得られると思います。

[1/1] SyncTest#test_synchronize = 0.51 s

  1. Failure:
    test_synchronize(SyncTest)
    [/Users/kenta-murata/work/ruby.git/test/test_sync.rb:57]:
    <[#<Thread:0x007f904183aa08 sleep>,
    #<Thread:0x007f904183ab98 sleep>,
    #<Thread:0x007f904183af58 sleep>]> expected but was
    <[#<Thread:0x007f904183aa08 sleep>,
    #<Thread:0x007f904183ab98 sleep>,
    #<Thread:0x007f904183af58 sleep>,
    #<Thread:0x007f904183aa08 sleep>]>.

修正用のパッチも上記 gist に添付してあります。修正方法がこの通りで良ければコミットしたいので、どなたかレビューをお願いします。

This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.

| Privacy Policy | Terms of Service | Remote Ruby Jobs