Class: IO::Event::Selector::Select::Waiter

Inherits:
Struct
  • Object
show all
Defined in:
lib/io/event/selector/select.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#eventsObject

Returns the value of attribute events

Returns:

  • (Object)

    the current value of events



114
115
116
# File 'lib/io/event/selector/select.rb', line 114

def events
  @events
end

#fiberObject

Returns the value of attribute fiber

Returns:

  • (Object)

    the current value of fiber



114
115
116
# File 'lib/io/event/selector/select.rb', line 114

def fiber
  @fiber
end

#tailObject

Returns the value of attribute tail

Returns:

  • (Object)

    the current value of tail



114
115
116
# File 'lib/io/event/selector/select.rb', line 114

def tail
  @tail
end

Instance Method Details

#alive?Boolean

Returns:

  • (Boolean)


115
116
117
# File 'lib/io/event/selector/select.rb', line 115

def alive?
	self.fiber&.alive?
end

#dispatch(events, &reactivate) ⇒ Object

Dispatch the given events to the list of waiting fibers. If the fiber was not waiting for the given events, it is reactivated by calling the given block.



120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
# File 'lib/io/event/selector/select.rb', line 120

def dispatch(events, &reactivate)
	# We capture the tail here, because calling reactivate might modify it:
	tail = self.tail
	
	if fiber = self.fiber
		if fiber.alive?
			revents = events & self.events
			if revents.zero?
				reactivate.call(self)
			else
				self.fiber = nil
				fiber.transfer(revents)
			end
		else
			self.fiber = nil
		end
	end
	
	tail&.dispatch(events, &reactivate)
end

#each(&block) ⇒ Object



145
146
147
148
149
150
151
# File 'lib/io/event/selector/select.rb', line 145

def each(&block)
	if fiber = self.fiber
		yield fiber, self.events
	end
	
	self.tail&.each(&block)
end

#invalidateObject



141
142
143
# File 'lib/io/event/selector/select.rb', line 141

def invalidate
	self.fiber = nil
end