Class: Celluloid::IO::Reactor::Monitor

Inherits:
Object
  • Object
show all
Defined in:
lib/ringleader/celluloid_fix.rb

Instance Method Summary collapse

Constructor Details

#initialize(selector, io) ⇒ Monitor

Returns a new instance of Monitor.



67
68
69
70
71
# File 'lib/ringleader/celluloid_fix.rb', line 67

def initialize(selector, io)
  @selector = selector
  @io = io
  @interests = {}
end

Instance Method Details

#interests_symbolObject



100
101
102
103
104
105
106
107
108
109
# File 'lib/ringleader/celluloid_fix.rb', line 100

def interests_symbol
  case @interests.keys
  when [:r]
    :r
  when [:w]
    :w
  when [:r, :w]
    :rw
  end
end

#reregisterObject



88
89
90
91
92
93
94
95
96
97
98
# File 'lib/ringleader/celluloid_fix.rb', line 88

def reregister
  if @monitor
    @monitor.close
    @monitor = nil
  end

  if interests_symbol
    @monitor = @selector.register(@io, interests_symbol)
    @monitor.value = self
  end
end

#resumeObject



111
112
113
114
115
116
117
118
119
120
121
122
123
# File 'lib/ringleader/celluloid_fix.rb', line 111

def resume
  raise "No monitor" unless @monitor

  if @monitor.readable?
    resume_for :r
  end

  if @monitor.writable?
    resume_for :w
  end

  reregister
end

#resume_for(interest) ⇒ Object



125
126
127
128
129
130
131
132
133
134
135
# File 'lib/ringleader/celluloid_fix.rb', line 125

def resume_for(interest)
  task = @interests.delete(interest)

  if task
    if task.running?
      task.resume
    else
      raise "reactor attempted to resume a dead task"
    end
  end
end

#wait(interest) ⇒ Object



81
82
83
84
85
86
# File 'lib/ringleader/celluloid_fix.rb', line 81

def wait(interest)
  raise "Already waiting for #{interest.inspect}" if @interests.include?(interest)
  @interests[interest] = Task.current
  reregister
  Task.suspend :iowait
end

#wait_readableObject



73
74
75
# File 'lib/ringleader/celluloid_fix.rb', line 73

def wait_readable
  wait :r
end

#wait_writableObject



77
78
79
# File 'lib/ringleader/celluloid_fix.rb', line 77

def wait_writable
  wait :w
end