class Async::Wrapper

Represents an asynchronous IO within a reactor.

def close

def close
	@monitor.close if @monitor
	@monitor = nil
end

def initialize(io, task)

def initialize(io, task)
	@io = io
	@task = task
	@monitor = nil
end

def monitor(interests)

def monitor(interests)
	unless @monitor
		@monitor = @task.register(@io, interests)
	else
		@monitor.interests = interests
	end
	
	@monitor.value = Fiber.current
	
	yield
	
ensure
	@monitor.value = nil if @monitor
end

def wait_any(interests = :rw)

def wait_any(interests = :rw)
	monitor(interests) do
		# Async.logger.debug "Fiber #{Fiber.current} yielding..."
		result = Fiber.yield
		
		# Async.logger.debug "Fiber #{Fiber.current} resuming with result #{result}..."
		raise result if result.is_a? Exception
	end
end

def wait_readable

def wait_readable
	wait_any(:r)
end

def wait_writable

def wait_writable
	wait_any(:w)
end