Class: FiberMon::RBFiberMon

Inherits:
Object
  • Object
show all
Includes:
MonitorMixin
Defined in:
lib/fiber-mon.rb

Defined Under Namespace

Classes: ConditionVariable, Monitor

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeRBFiberMon

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

#currentObject (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_yieldObject

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_startObject 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_cvObject Also known as: new_cond



152
153
154
# File 'lib/fiber-mon.rb', line 152

def new_cv
  ConditionVariable.new(self)
end

#new_monObject



148
149
150
# File 'lib/fiber-mon.rb', line 148

def new_mon
  Monitor.new(self)
end

#yieldObject

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