diff --git lib/pstore.rb lib/pstore.rb index 65cce7b..4d80e2c 100644 --- lib/pstore.rb +++ lib/pstore.rb @@ -318,8 +318,8 @@ class PStore # def transaction(read_only = false, &block) # :yields: pstore value = nil - raise PStore::Error, "nested transaction" if @transaction @lock.synchronize do + raise PStore::Error, "nested transaction" if @transaction @rdonly = read_only @transaction = true @abort = false diff --git test/test_pstore.rb test/test_pstore.rb index e10ce90..32d79ea 100644 --- test/test_pstore.rb +++ test/test_pstore.rb @@ -71,4 +71,33 @@ class PStoreTest < Test::Unit::TestCase end end end + + def test_thread_safe + assert_raise(PStore::Error) do + flag = false + Thread.new do + @pstore.transaction do + @pstore[:foo] = "bar" + flag = true + sleep 1 + end + end + until flag; end + @pstore.transaction {} + end + assert_block do + pstore = PStore.new("pstore.tmp2.#{Process.pid}",true) + flag = false + Thread.new do + pstore.transaction do + pstore[:foo] = "bar" + flag = true + sleep 1 + end + end + until flag; end + pstore.transaction { pstore[:foo] == "bar" } + File.unlink("pstore.tmp2.#{Process.pid}") rescue nil + end + end end