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



125
126
127
# File 'lib/io/event/selector/select.rb', line 125

def events
  @events
end

#fiberObject

Returns the value of attribute fiber

Returns:

  • (Object)

    the current value of fiber



125
126
127
# File 'lib/io/event/selector/select.rb', line 125

def fiber
  @fiber
end

#tailObject

Returns the value of attribute tail

Returns:

  • (Object)

    the current value of tail



125
126
127
# File 'lib/io/event/selector/select.rb', line 125

def tail
  @tail
end

Instance Method Details

#alive?Boolean

Returns:

  • (Boolean)


127
128
129
# File 'lib/io/event/selector/select.rb', line 127

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.



132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
# File 'lib/io/event/selector/select.rb', line 132

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.



159
160
161
162
163
164
165
# File 'lib/io/event/selector/select.rb', line 159

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.



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

def invalidate
	self.fiber = nil
end