Class: FiberMon::RBFiberMon
- Inherits:
-
Object
- Object
- FiberMon::RBFiberMon
- Includes:
- MonitorMixin
- Defined in:
- lib/fiber-mon.rb
Defined Under Namespace
Classes: ConditionVariable, Monitor
Instance Attribute Summary collapse
-
#current ⇒ Object
readonly
Returns the value of attribute current.
Instance Method Summary collapse
- #entry_fiber(p0 = nil, &block) ⇒ Object (also: #entry)
- #entry_wait_resume(*fbs) ⇒ Object
-
#fiber_yield ⇒ Object
def fiber_yield begin status = nil @mon_mxmx.synchronize do if status = @owner == Thread.current && @mon_mx.locked? @mon_mx.unlock @owner = nil end end Fiber.yield rescue Log::debug_exception(self) ensure @mon_mxmx.synchronize do if status @owner = Thread.current @mon_mx.lock end end end end.
-
#initialize ⇒ RBFiberMon
constructor
A new instance of RBFiberMon.
- #mon_start ⇒ Object (also: #start)
- #new_cv ⇒ Object (also: #new_cond)
- #new_mon ⇒ Object
-
#yield ⇒ Object
alias start entry_fiber.
Constructor Details
#initialize ⇒ RBFiberMon
Returns a new instance of RBFiberMon.
17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
# File 'lib/fiber-mon.rb', line 17 def initialize super # @mon_mx = Mutex.new # @owner = nil # @mon_mxmx = Mutex.new @started = false @current = nil @entries = [] @wait_resume = [] @wait_resume_mx = ::Mutex.new @wait_resume_cv = ::XThread::ConditionVariable.new mon_start end |
Instance Attribute Details
#current ⇒ Object (readonly)
Returns the value of attribute current.
37 38 39 |
# File 'lib/fiber-mon.rb', line 37 def current @current end |
Instance Method Details
#entry_fiber(p0 = nil, &block) ⇒ Object Also known as: entry
75 76 77 78 79 80 81 |
# File 'lib/fiber-mon.rb', line 75 def entry_fiber(p0 = nil, &block) p0 = block if block @wait_resume_mx.synchronize do @entries.push p0 @wait_resume_cv.signal end end |
#entry_wait_resume(*fbs) ⇒ Object
157 158 159 160 161 162 |
# File 'lib/fiber-mon.rb', line 157 def entry_wait_resume(*fbs) @wait_resume_mx.synchronize do @wait_resume.concat(fbs) @wait_resume_cv.signal end end |
#fiber_yield ⇒ Object
def fiber_yield
begin
status = nil @mon_mxmx.synchronize do if status = @owner == Thread.current && @mon_mx.locked? @mon_mx.unlock @owner = nil end end Fiber.yield
rescue
Log::debug_exception(self)
ensure
@mon_mxmx.synchronize do if status @owner = Thread.current @mon_mx.lock end end
end
end
130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 |
# File 'lib/fiber-mon.rb', line 130 def fiber_yield begin mon_check_owner rescue return Fiber.yield end if (count = mon_exit_for_cond) > 0 begin Fiber.yield @mon_mutex ensure @mon_mutex.lock end else Fiber.yield end mon_enter_for_cond(count) end |
#mon_start ⇒ Object Also known as: start
39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 |
# File 'lib/fiber-mon.rb', line 39 def mon_start return if @started @started = true th = Thread.start{ loop do @wait_resume_mx.synchronize do while @wait_resume.empty? && @entries.empty? @wait_resume_cv.wait(@wait_resume_mx) end if block = @entries.shift @current = Fiber.new{block.call(self)} else @current = @wait_resume.shift end end begin mx = @current.resume if @current # rescue # if $DEBUG # p $! # puts $@ # end # raise ensure if mx.kind_of?(Mutex) mx.unlock end @current = nil end end } th end |
#new_cv ⇒ Object Also known as: new_cond
152 153 154 |
# File 'lib/fiber-mon.rb', line 152 def new_cv ConditionVariable.new(self) end |
#yield ⇒ Object
alias start entry_fiber
85 86 87 88 89 90 91 |
# File 'lib/fiber-mon.rb', line 85 def yield @wait_resume_mx.synchronize do @wait_resume.push @current @wait_resume_cv.signal end fiber_yield end |