Check double-lock in Mutex. Update book keeping on unlock.
This commit is contained in:
parent
44d1e79a10
commit
b4b869e074
|
@ -20,6 +20,10 @@ module ProcessShared
|
|||
|
||||
# @return [Mutex]
|
||||
def lock
|
||||
if locked_by == ::Process.pid
|
||||
raise ProcessError, "already locked by this process #{::Process.pid}"
|
||||
end
|
||||
|
||||
@sem.wait
|
||||
self.locked_by = ::Process.pid
|
||||
self
|
||||
|
@ -37,7 +41,7 @@ module ProcessShared
|
|||
def sleep(timeout = nil)
|
||||
unlock
|
||||
begin
|
||||
timeout ? sleep(timeout) : sleep
|
||||
timeout ? Kernel.sleep(timeout) : Kernel.sleep
|
||||
ensure
|
||||
lock
|
||||
end
|
||||
|
@ -62,6 +66,7 @@ module ProcessShared
|
|||
raise ProcessError, "lock is held by #{p} not #{::Process.pid}"
|
||||
end
|
||||
|
||||
self.locked_by = 0
|
||||
@sem.post
|
||||
self
|
||||
end
|
||||
|
|
|
@ -70,5 +70,13 @@ module ProcessShared
|
|||
|
||||
::Process.wait(pid)
|
||||
end
|
||||
|
||||
it 'raises exception when locked twice by same process' do
|
||||
mutex = Mutex.new
|
||||
|
||||
mutex.lock
|
||||
proc { mutex.lock }.must_raise(ProcessError)
|
||||
mutex.unlock
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
Loading…
Reference in New Issue