Partial MonitorMixin implementation.
This commit is contained in:
parent
80284301a7
commit
5aba20cdf7
|
@ -29,4 +29,5 @@ require 'process_shared/binary_semaphore'
|
||||||
require 'process_shared/mutex'
|
require 'process_shared/mutex'
|
||||||
require 'process_shared/condition_variable'
|
require 'process_shared/condition_variable'
|
||||||
require 'process_shared/monitor'
|
require 'process_shared/monitor'
|
||||||
|
require 'process_shared/monitor_mixin'
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,42 @@
|
||||||
|
require 'process_shared'
|
||||||
|
|
||||||
|
module ProcessShared
|
||||||
|
module MonitorMixin
|
||||||
|
def self.extended(obj)
|
||||||
|
obj.send :mon_initialize
|
||||||
|
end
|
||||||
|
|
||||||
|
def mon_enter
|
||||||
|
@mon_monitor.lock
|
||||||
|
end
|
||||||
|
|
||||||
|
def mon_exit
|
||||||
|
@mon_monitor.unlock
|
||||||
|
end
|
||||||
|
|
||||||
|
def mon_synchronize
|
||||||
|
mon_enter
|
||||||
|
begin
|
||||||
|
yield
|
||||||
|
ensure
|
||||||
|
mon_exit
|
||||||
|
end
|
||||||
|
end
|
||||||
|
alias_method :synchronize, :mon_synchronize
|
||||||
|
|
||||||
|
def mon_try_enter
|
||||||
|
raise NotImplementedError, 'not implemented'
|
||||||
|
end
|
||||||
|
alias_method :try_mon_enter, :mon_try_enter
|
||||||
|
|
||||||
|
def new_cond
|
||||||
|
raise NotImplementedError, 'not implemented'
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def mon_initialize
|
||||||
|
@mon_monitor = Monitor.new
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -0,0 +1,33 @@
|
||||||
|
require 'spec_helper'
|
||||||
|
require 'process_shared'
|
||||||
|
|
||||||
|
module ProcessShared
|
||||||
|
describe MonitorMixin do
|
||||||
|
|
||||||
|
before :each do
|
||||||
|
@obj = Object.new
|
||||||
|
@obj.extend(MonitorMixin)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'raises exception when unlocked by other process' do
|
||||||
|
pid = Kernel.fork do
|
||||||
|
@obj.mon_enter
|
||||||
|
sleep 0.2
|
||||||
|
@obj.mon_exit
|
||||||
|
Kernel.exit!
|
||||||
|
end
|
||||||
|
|
||||||
|
sleep 0.1
|
||||||
|
proc { @obj.mon_exit }.must_raise(ProcessError)
|
||||||
|
|
||||||
|
::Process.wait(pid)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'raises nothing with nested lock' do
|
||||||
|
@obj.mon_enter
|
||||||
|
@obj.mon_enter
|
||||||
|
@obj.mon_exit
|
||||||
|
@obj.mon_exit
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
Loading…
Reference in New Issue