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



102
103
104
# File 'lib/io/event/selector/select.rb', line 102

def events
  @events
end

#fiberObject

Returns the value of attribute fiber

Returns:

  • (Object)

    the current value of fiber



102
103
104
# File 'lib/io/event/selector/select.rb', line 102

def fiber
  @fiber
end

#tailObject

Returns the value of attribute tail

Returns:

  • (Object)

    the current value of tail



102
103
104
# File 'lib/io/event/selector/select.rb', line 102

def tail
  @tail
end

Instance Method Details

#alive?Boolean

Returns:

  • (Boolean)


103
104
105
# File 'lib/io/event/selector/select.rb', line 103

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.



108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
# File 'lib/io/event/selector/select.rb', line 108

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



133
134
135
136
137
138
139
# File 'lib/io/event/selector/select.rb', line 133

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

#invalidateObject



129
130
131
# File 'lib/io/event/selector/select.rb', line 129

def invalidate
	self.fiber = nil
end