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

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

Overview

A linked list node used to track fibers waiting for IO events.

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



119
120
121
# File 'lib/io/event/selector/select.rb', line 119

def events
  @events
end

#fiberObject

Returns the value of attribute fiber

Returns:

  • (Object)

    the current value of fiber



119
120
121
# File 'lib/io/event/selector/select.rb', line 119

def fiber
  @fiber
end

#tailObject

Returns the value of attribute tail

Returns:

  • (Object)

    the current value of tail



119
120
121
# File 'lib/io/event/selector/select.rb', line 119

def tail
  @tail
end

Instance Method Details

#alive?Boolean

Returns:

  • (Boolean)


121
122
123
# File 'lib/io/event/selector/select.rb', line 121

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.



126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
# File 'lib/io/event/selector/select.rb', line 126

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

Iterate over each active waiting fiber and its requested events.



153
154
155
156
157
158
159
# File 'lib/io/event/selector/select.rb', line 153

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

#invalidateObject

Clear the waiting fiber so it will not be resumed.



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

def invalidate
	self.fiber = nil
end