class IO::Event::Selector::Select

def io_read(fiber, io, buffer, length, offset = 0)

@parameter offset [Integer] The offset into the buffer to read to.
@parameter length [Integer] The minimum number of bytes to read.
def io_read(fiber, io, buffer, length, offset = 0)
	total = 0
	
	Selector.nonblock(io) do
		while true
			result = Fiber.blocking{buffer.read(io, 0, offset)}
			
			if result < 0
				if again?(result)
					self.io_wait(fiber, io, IO::READABLE)
				else
					return result
				end
			elsif result == 0
				break
			else
				total += result
				break if total >= length
				offset += result
			end
		end
	end
	
	return total
end