mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
* lib/pstore.rb: Delete variable @transaction and fix #4474. Patch by
Masaki Matsushita (Glass_saga). * test/test_pstore.rb(test_thread_safe): Add test for #4474. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@31050 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
52b40be04b
commit
e267617f3e
3 changed files with 39 additions and 17 deletions
|
@ -1,3 +1,10 @@
|
|||
Mon Mar 7 22:59:39 2011 Shota Fukumori <sorah@tubusu.net>
|
||||
|
||||
* lib/pstore.rb: Delete variable @transaction and fix #4474. Patch by
|
||||
Masaki Matsushita (Glass_saga).
|
||||
|
||||
* test/test_pstore.rb(test_thread_safe): Add test for #4474.
|
||||
|
||||
Mon Mar 7 21:31:38 2011 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
|
||||
|
||||
* process.c (proc_setgroups): replace getgrnam() with getgrnam_r()
|
||||
|
|
|
@ -127,21 +127,16 @@ class PStore
|
|||
if File::exist? file and not File::readable? file
|
||||
raise PStore::Error, format("file %s not readable", file)
|
||||
end
|
||||
@transaction = false
|
||||
@filename = file
|
||||
@abort = false
|
||||
@ultra_safe = false
|
||||
@thread_safe = thread_safe
|
||||
if @thread_safe
|
||||
@lock = Mutex.new
|
||||
else
|
||||
@lock = DummyMutex.new
|
||||
end
|
||||
@lock = Mutex.new
|
||||
end
|
||||
|
||||
# Raises PStore::Error if the calling code is not in a PStore#transaction.
|
||||
def in_transaction
|
||||
raise PStore::Error, "not in transaction" unless @transaction
|
||||
raise PStore::Error, "not in transaction" unless @lock.locked?
|
||||
end
|
||||
#
|
||||
# Raises PStore::Error if the calling code is not in a PStore#transaction or
|
||||
|
@ -318,10 +313,9 @@ class PStore
|
|||
#
|
||||
def transaction(read_only = false, &block) # :yields: pstore
|
||||
value = nil
|
||||
raise PStore::Error, "nested transaction" if @transaction
|
||||
raise PStore::Error, "nested transaction" if !@thread_safe && @lock.locked?
|
||||
@lock.synchronize do
|
||||
@rdonly = read_only
|
||||
@transaction = true
|
||||
@abort = false
|
||||
file = open_and_lock_file(@filename, read_only)
|
||||
if file
|
||||
|
@ -347,8 +341,6 @@ class PStore
|
|||
end
|
||||
end
|
||||
value
|
||||
ensure
|
||||
@transaction = false
|
||||
end
|
||||
|
||||
private
|
||||
|
@ -357,12 +349,6 @@ class PStore
|
|||
EMPTY_MARSHAL_DATA = Marshal.dump({})
|
||||
EMPTY_MARSHAL_CHECKSUM = Digest::MD5.digest(EMPTY_MARSHAL_DATA)
|
||||
|
||||
class DummyMutex
|
||||
def synchronize
|
||||
yield
|
||||
end
|
||||
end
|
||||
|
||||
#
|
||||
# Open the specified filename (either in read-only mode or in
|
||||
# read-write mode) and lock it for reading or writing.
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue