1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
|
# frozen_string_literal: true
# Released under the MIT License.
# Copyright, 2021-2024, by Samuel Williams.
module IO::Event
# A thread safe synchronisation primative.
class Interrupt
def self.attach(selector)
self.new(selector)
end
def initialize(selector)
@selector = selector
@input, @output = ::IO.pipe
@fiber = Fiber.new do
while true
if @selector.io_wait(@fiber, @input, IO::READABLE)
@input.read_nonblock(1)
end
end
end
@fiber.transfer
end
# Send a sigle byte interrupt.
def signal
@output.write(".")
@output.flush
rescue IOError
# Ignore.
end
def close
@input.close
@output.close
# @fiber.raise(::Interrupt)
end
end
private_constant :Interrupt
end
|