Class: Event::Backend::Select

Inherits:
Object
  • Object
show all
Defined in:
lib/event/backend/select.rb

Instance Method Summary collapse

Constructor Details

#initialize(loop) ⇒ Select

Returns a new instance of Select.



24
25
26
27
28
29
# File 'lib/event/backend/select.rb', line 24

def initialize(loop)
	@loop = loop
	
	@readable = {}
	@writable = {}
end

Instance Method Details

#closeObject



31
32
33
34
35
# File 'lib/event/backend/select.rb', line 31

def close
	@loop = nil
	@readable = nil
	@writable = nil
end

#io_wait(fiber, io, events) ⇒ Object



37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
# File 'lib/event/backend/select.rb', line 37

def io_wait(fiber, io, events)
	remove_readable = remove_writable = false
	
	if (events & READABLE) > 0 or (events & PRIORITY) > 0
		@readable[io] = fiber
		remove_readable = true
	end
	
	if (events & WRITABLE) > 0
		@writable[io] = fiber
		remove_writable = true
	end
	
	@loop.transfer
ensure
	@readable.delete(io) if remove_readable
	@writable.delete(io) if remove_writable
end

#process_wait(fiber, pid, flags) ⇒ Object



56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
# File 'lib/event/backend/select.rb', line 56

def process_wait(fiber, pid, flags)
	r, w = IO.pipe
	
	thread = Thread.new do
		Process::Status.wait(pid, flags)
	ensure
		w.close
	end
	
	self.io_wait(fiber, r, READABLE)
	
	return thread.value
ensure
	r.close
	w.close
	thread&.kill
end

#select(duration = nil) ⇒ Object



74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
# File 'lib/event/backend/select.rb', line 74

def select(duration = nil)
	readable, writable, _ = ::IO.select(@readable.keys, @writable.keys, nil, duration)
	
	ready = Hash.new(0)
	
	readable&.each do |io|
		fiber = @readable.delete(io)
		ready[fiber] |= READABLE
	end
	
	writable&.each do |io|
		fiber = @writable.delete(io)
		ready[fiber] |= WRITABLE
	end
	
	ready.each do |fiber, events|
		fiber.transfer(events) if fiber.alive?
	end
end