Project

General

Profile

Feature #4483 » patch.diff

Glass_saga (Masaki Matsushita), 03/08/2011 02:36 PM

View differences:

lib/pstore.rb
# PStore objects are always reentrant. But if _thread_safe_ is set to true,
# then it will become thread-safe at the cost of a minor performance hit.
#
def initialize(file, thread_safe = false)
def initialize(file)
dir = File::dirname(file)
unless File::directory? dir
raise PStore::Error, format("directory %s does not exist", dir)
......
@filename = file
@abort = false
@ultra_safe = false
@thread_safe = thread_safe
@lock = Mutex.new
end
......
#
def transaction(read_only = false, &block) # :yields: pstore
value = nil
raise PStore::Error, "nested transaction" if !@thread_safe && @lock.locked?
@lock.synchronize do
@rdonly = read_only
@abort = false
test/test_pstore.rb
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)
pstore = PStore.new("pstore.tmp2.#{Process.pid}")
flag = false
Thread.new do
pstore.transaction do
    (1-1/1)