Skip to content
This repository has been archived by the owner on Jun 25, 2018. It is now read-only.

Commit

Permalink
dummy
Browse files Browse the repository at this point in the history
  • Loading branch information
unknown committed Jul 27, 2009
1 parent e2b0e38 commit 553fc4a
Show file tree
Hide file tree
Showing 3 changed files with 66 additions and 66 deletions.
60 changes: 30 additions & 30 deletions lib/never_block/io/neverblock_io.rb
Expand Up @@ -6,15 +6,15 @@
# NeverBlocks event loop to avoid blocking IO calls. That's done by delegating
# all the reading methods to read_nonblock and all the writting methods to
# write_nonblock.


class IO

include NeverBlock::IO::FiberedIOConnection

NB_BUFFER_LENGTH = 1024
alias_method :read_blocking, :sysread
alias_method :read_blocking, :sysread
alias_method :write_blocking, :syswrite


attr_accessor :immediate_result

def buffer
Expand All @@ -30,58 +30,58 @@ def get_reading_result
# and registers the IO call with event loop if the call blocks. The value
# @immediate_result is used to get the value that method got before it was blocked.


def read_neverblock(*args)

def read_neverblock(*args)
res = ""
begin
raise Timeout::Error if Fiber.current[:exceeded_timeout]
@immediate_result = read_nonblock(*args)
res << @immediate_result
rescue Errno::EWOULDBLOCK, Errno::EAGAIN, Errno::EINTR
attach_to_reactor(:read)
retry
retry
end
res
end
res
end

# The is the main reading method that all other methods use.
# If the mode is set to neverblock it uses the delegation method.
# Otherwise it uses the original ruby read method.


def sysread(*args)
if Fiber.current[:neverblock]
kernel.puts 'trying to read'
res = read_neverblock(*args)
res = read_neverblock(*args)
else
res = read_blocking(*args)
res = read_blocking(*args)
end
res
end

res
end

def read(length=0, sbuffer=nil)
return '' if length == 0
unless buffer.length > length
begin
begin
buffer << sysread(NB_BUFFER_LENGTH > length ? NB_BUFFER_LENGTH : length, sbuffer)
sbuffer.slice!(length..sbuffer.length-1) if !sbuffer.nil?
rescue Errno::EOFError
return nil
return nil
end
end
buffer.slice!(0..length-1)
end

end
buffer.slice!(0..length-1)
end

def write_neverblock(data)
written = 0
written = 0
begin
raise Timeout::Error if Fiber.current[:exceeded_timeout]
written = written + write_nonblock(data[written,data.length])
raise Errno::EAGAIN if written < data.length
rescue Errno::EWOULDBLOCK, Errno::EAGAIN, Errno::EINTR
raise Timeout::Error if Fiber.current[:exceeded_timeout]
written = written + write_nonblock(data[written,data.length])
raise Errno::EAGAIN if written < data.length
rescue Errno::EWOULDBLOCK, Errno::EAGAIN, Errno::EINTR
attach_to_reactor(:read)
retry
end
written
retry
end
written
end

def syswrite(*args)
Expand All @@ -90,7 +90,7 @@ def syswrite(*args)
else
write_blocking(*args)
end
end
end

def write(*args)
syswrite(*args)
Expand Down Expand Up @@ -157,5 +157,5 @@ def readbytes(*args)

def print(*args)
args.each{|element|syswrite(element)}
end
end
end
32 changes: 16 additions & 16 deletions lib/never_block/socket/fix_sockets.rb
Expand Up @@ -80,44 +80,44 @@ def self.pair(*args)

end

Object.send(:remove_const, :TCPSocket)

class TCPSocket < Socket
Object.send(:remove_const, :TCPSocket)

class TCPSocket < Socket

alias_method :recv_blocking, :recv

def initialize(*args)
super(AF_INET, SOCK_STREAM, 0)
def initialize(*args)
super(AF_INET, SOCK_STREAM, 0)
self.connect(Socket.sockaddr_in(*(args.reverse)))
end


def recv_neverblock(*args)
def recv_neverblock(*args)
res = ""
begin
@immediate_result = recv_nonblock(*args)
res << @immediate_result
rescue Errno::EWOULDBLOCK, Errno::EAGAIN, Errno::EINTR
attach_to_reactor(:read)
retry
retry
end
res
res
end

def recv(*args)
if Fiber.current[:neverblock]
res = recv_neverblock(*args)
res = recv_neverblock(*args)
else
res = recv_blocking(*args)
res = recv_blocking(*args)
end
res
res
end

end

class BasicSocket
@@getaddress_method = IPSocket.method(:getaddress)
def self.getaddress(*args)
@@getaddress_method.call(*args)
end
class BasicSocket
@@getaddress_method = IPSocket.method(:getaddress)
def self.getaddress(*args)
@@getaddress_method.call(*args)
end
end
40 changes: 20 additions & 20 deletions lib/never_block/socket/socket_neverblock.rb
@@ -1,25 +1,25 @@
require 'rubygems'
require File.expand_path(File.dirname(__FILE__) + "/fix_sockets")

class Socket

class Socket

alias_method :connect_blocking, :connect

def connect_neverblock(server_sockaddr)
begin
connect_nonblock(server_sockaddr)
rescue Errno::EINPROGRESS, Errno::EINTR, Errno::EALREADY, Errno::EWOULDBLOCK
attach_to_reactor(:write)
retry
rescue Errno::EISCONN
end
end

def connect(server_sockaddr)
if Fiber.current[:neverblock]
connect_neverblock(server_sockaddr)
else
connect_blocking(server_sockaddr)
end
end

def connect_neverblock(server_sockaddr)
begin
connect_nonblock(server_sockaddr)
rescue Errno::EINPROGRESS, Errno::EINTR, Errno::EALREADY, Errno::EWOULDBLOCK
attach_to_reactor(:write)
retry
rescue Errno::EISCONN
end
end

def connect(server_sockaddr)
if Fiber.current[:neverblock]
connect_neverblock(server_sockaddr)
else
connect_blocking(server_sockaddr)
end
end
end

0 comments on commit 553fc4a

Please sign in to comment.