class IO::Event::Debug::Selector

Enforces the selector interface and delegates operations to a wrapped selector instance.

def close

def close
	if @selector.nil?
		raise "Selector already closed!"
	end
	
	@selector.close
	@selector = nil
end

def initialize(selector)

def initialize(selector)
	@selector = selector
	
	@readable = {}
	@writable = {}
	@priority = {}
	
	unless Fiber.current == selector.loop
		raise "Selector must be initialized on event loop fiber!"
	end
end

def io_read(fiber, io, buffer, length)

def io_read(fiber, io, buffer, length)
	@selector.io_read(fiber, io, buffer, length)
end

def io_wait(fiber, io, events)

def io_wait(fiber, io, events)
	register_readable(fiber, io, events)
end

def io_write(fiber, io, buffer, length)

def io_write(fiber, io, buffer, length)
	@selector.io_write(fiber, io, buffer, length)
end

def process_wait(*arguments)

def process_wait(*arguments)
	@selector.process_wait(*arguments)
end

def push(fiber)

def push(fiber)
	@selector.push(fiber)
end

def raise(fiber, *arguments)

def raise(fiber, *arguments)
	@selector.raise(fiber, *arguments)
end

def ready?

def ready?
	@selector.ready?
end

def register_priority(fiber, io, events)

def register_priority(fiber, io, events)
	if (events & IO::PRIORITY) > 0
		if @priority.key?(io)
			raise "Cannot wait for #{io} to become priority from multiple fibers."
		end
		
		begin
			@priority[io] = fiber
			
			@selector.io_wait(fiber, io, events)
		ensure
			@priority.delete(io)
		end
	else
		@selector.io_wait(fiber, io, events)
	end
end

def register_readable(fiber, io, events)

def register_readable(fiber, io, events)
	if (events & IO::READABLE) > 0
		if @readable.key?(io)
			raise "Cannot wait for #{io} to become readable from multiple fibers."
		end
		
		begin
			@readable[io] = fiber
			
			register_writable(fiber, io, events)
		ensure
			@readable.delete(io)
		end
	else
		register_writable(fiber, io, events)
	end
end

def register_writable(fiber, io, events)

def register_writable(fiber, io, events)
	if (events & IO::WRITABLE) > 0
		if @writable.key?(io)
			raise "Cannot wait for #{io} to become writable from multiple fibers."
		end
		
		begin
			@writable[io] = fiber
			
			register_priority(fiber, io, events)
		ensure
			@writable.delete(io)
		end
	else
		register_priority(fiber, io, events)
	end
end

def resume(*arguments)

def resume(*arguments)
	@selector.resume(*arguments)
end

def select(duration = nil)

def select(duration = nil)
	unless Fiber.current == @selector.loop
		raise "Selector must be run on event loop fiber!"
	end
	
	@selector.select(duration)
end

def transfer(fiber, *arguments)

def transfer(fiber, *arguments)
	@selector.transfer(fiber, *arguments)
end

def transfer(*arguments)

def transfer(*arguments)
	@selector.transfer(*arguments)
end

def wakeup

def wakeup
	@selector.wakeup
end

def yield

def yield
	@selector.yield
end