From: Masaki Matsushita Date: 2011-03-10T20:25:37+09:00 Subject: [ruby-dev:43337] [Ruby 1.9 - Bug #4474] 複数のスレッドからトランザクションに入ろうとした場合のPStoreの挙動 Issue #4474 has been updated by Masaki Matsushita. File patch2.diff added r31050にて#4のパッチが取り込まれましたが、 require 'pstore' p = PStore.new("foo", true) p.transaction { p.transaction { } } 上記のコードで例外nested transaction (PStore::Error)ではなく例外deadlock; recursive locking (ThreadError)が発生するというバグがありましたのでこれを修正するパッチを書きました。 つきましては、こちらのパッチも取り込んで頂けないでしょうか? よろしくお願いします。 ---------------------------------------- Bug #4474: 複数のスレッドからトランザクションに入ろうとした場合のPStoreの挙動 http://redmine.ruby-lang.org/issues/4474 Author: Masaki Matsushita Status: Closed Priority: Normal Assignee: Category: lib Target version: ruby -v: - PStoreは、initializeの第2引数thread_safeが真であればデータベースの読み書きをMutexで同期するようになっています。 しかし、次のコード require 'pstore' require 'thread' pstore = PStore.new("foo", true) q = Queue.new Thread.start do pstore.transaction do pstore[:hoge] = "fuga" q.push(nil) sleep end end q.pop pstore.transaction do p pstore[:hoge] end を実行すると例外が発生します。 /usr/local/lib/ruby/1.9.1/pstore.rb:321:in `transaction': nested transaction (PStore::Error) from pstore.rb:16:in `
' 以下のコードはpstore.rbの319行目以降から抜粋したものです。 319 def transaction(read_only = false, &block) # :yields: pstore 320 value = nil 321 raise PStore::Error, "nested transaction" if @transaction 322 @lock.synchronize do      (中略) 348 end (中略) 352 end Mutexで保護されたセクションに入る前に、別のトランザクションが実行されていないかどうか調べています。 あるスレッドがトランザクションを実行中に別のスレッドがトランザクションに入ろうとすると、ここで例外が発生します。 thread-safeの定義にも依りますが、これはバグではないでしょうか? -- http://redmine.ruby-lang.org