about summary refs log tree commit homepage
path: root/lib/rainbows/fiber
diff options
context:
space:
mode:
authorEric Wong <normalperson@yhbt.net>2011-02-04 20:39:41 -0800
committerEric Wong <normalperson@yhbt.net>2011-02-04 20:39:41 -0800
commit7246d2f2d1601dbb5486ce7f9ddbebd1bb975b58 (patch)
treefd2c407b4c9bed38fbfc2d586a3c5c905954045a /lib/rainbows/fiber
parente00c2e8c53ad5b47baa5bc6a8765b7c3c92296b9 (diff)
downloadrainbows-7246d2f2d1601dbb5486ce7f9ddbebd1bb975b58.tar.gz
We want to use the singleton methods in Kgio to reduce
conditionals.
Diffstat (limited to 'lib/rainbows/fiber')
-rw-r--r--lib/rainbows/fiber/io.rb82
1 files changed, 20 insertions, 62 deletions
diff --git a/lib/rainbows/fiber/io.rb b/lib/rainbows/fiber/io.rb
index ac243a4..49aef3d 100644
--- a/lib/rainbows/fiber/io.rb
+++ b/lib/rainbows/fiber/io.rb
@@ -45,78 +45,36 @@ class Rainbows::Fiber::IO
   end
 
   def write(buf)
-    if @to_io.respond_to?(:kgio_trywrite)
-      begin
-        case rv = @to_io.kgio_trywrite(buf)
-        when nil
-          return
-        when String
-          buf = rv
-        when :wait_writable
-          kgio_wait_writable
-        end
-      end while true
-    else
-      begin
-        (rv = @to_io.write_nonblock(buf)) == buf.bytesize and return
-        buf = byte_slice(buf, rv)
-      rescue Errno::EAGAIN
-        kgio_wait_writable
-      end while true
-    end
-  end
-
-  def byte_slice(buf, start) # :nodoc:
-    buf.encoding == Encoding::BINARY or
-      buf = buf.dup.force_encoding(Encoding::BINARY)
-    buf.slice(start, buf.size)
+    case rv = Kgio.trywrite(buf)
+    when String
+      buf = rv
+    when :wait_writable
+      kgio_wait_writable
+    end until nil == rv
   end
 
   # used for reading headers (respecting keepalive_timeout)
   def timed_read(buf)
     expire = nil
-    if @to_io.respond_to?(:kgio_tryread)
-      begin
-        case rv = @to_io.kgio_tryread(16384, buf)
-        when :wait_readable
-          return if expire && expire < Time.now
-          expire ||= read_expire
-          kgio_wait_readable
-        else
-          return rv
-        end
-      end while true
+    case rv = Kgio.tryread(@to_io, 16384, buf)
+    when :wait_readable
+      return if expire && expire < Time.now
+      expire ||= read_expire
+      kgio_wait_readable
     else
-      begin
-        return @to_io.read_nonblock(16384, buf)
-      rescue Errno::EAGAIN
-        return if expire && expire < Time.now
-        expire ||= read_expire
-        kgio_wait_readable
-      end while true
-    end
+      return rv
+    end while true
   end
 
   def readpartial(length, buf = "")
-    if @to_io.respond_to?(:kgio_tryread)
-      begin
-        rv = @to_io.kgio_tryread(length, buf)
-        case rv
-        when nil
-          raise EOFError, "end of file reached", []
-        when :wait_readable
-          kgio_wait_readable
-        else
-          return rv
-        end
-      end while true
+    case rv = Kgio.tryread(@to_io, length, buf)
+    when nil
+      raise EOFError, "end of file reached", []
+    when :wait_readable
+      kgio_wait_readable
     else
-      begin
-        return @to_io.read_nonblock(length, buf)
-      rescue Errno::EAGAIN
-        kgio_wait_readable
-      end while true
-    end
+      return rv
+    end while true
   end
 
   def kgio_read(*args)