module Rainbows::XEpollThreadSpawn::Client

Constants

ACCEPTORS
EP
IN
KATO
LOCK
N

Public Class Methods

expire() click to toggle source
# File lib/rainbows/xepoll_thread_spawn/client.rb, line 59
def self.expire
  return if ((now = Rainbows.now) - @@last_expire) < 1.0
  if (ot = KEEPALIVE_TIMEOUT) >= 0
    ot = now - ot
    defer = []
    LOCK.synchronize do
      KATO.delete_if { |client, time| time < ot and defer << client }
    end
    defer.each { |io| io.closed? or io.close }
  end
  @@last_expire = now
end
included(klass) click to toggle source
# File lib/rainbows/xepoll_thread_spawn/client.rb, line 8
def self.included(klass) # included in Rainbows::Client
  max = Rainbows.server.worker_connections
  ACCEPTORS.map! do |sock|
    Thread.new do
      buf = ""
      begin
        if io = sock.kgio_accept(klass)
          N.incr(0, 1)
          io.epoll_once(buf)
        end
        worker_yield while N[0] >= max
      rescue => e
        Rainbows::Error.listen_loop(e)
      end while Rainbows.alive
    end
  end
end
loop() click to toggle source
# File lib/rainbows/xepoll_thread_spawn/client.rb, line 47
def self.loop
  buf = ""
  begin
    EP.wait(nil, 1000) { |_, obj| obj.epoll_run(buf) }
    expire
  rescue Errno::EINTR
  rescue => e
    Rainbows::Error.listen_loop(e)
  end while Rainbows.tick || N[0] > 0
  Rainbows::JoinThreads.acceptors(ACCEPTORS)
end

Public Instance Methods

close() click to toggle source
Calls superclass method
# File lib/rainbows/xepoll_thread_spawn/client.rb, line 77
def close
  super
  kato_delete
  N.decr(0, 1)
  nil
end
epoll_once(buf) click to toggle source
# File lib/rainbows/xepoll_thread_spawn/client.rb, line 72
def epoll_once(buf)
  @hp = Rainbows::HttpParser.new
  epoll_run(buf)
end
epoll_run(buf) click to toggle source
# File lib/rainbows/xepoll_thread_spawn/client.rb, line 90
def epoll_run(buf)
  case kgio_tryread(CLIENT_HEADER_BUFFER_SIZE, buf)
  when :wait_readable
    return kato_set
  when String
    kato_delete
    env = @hp.add_parse(buf) and return spawn(env, @hp)
  else
    return close
  end while true
rescue => e
  handle_error(e)
end
handle_error(e) click to toggle source
Calls superclass method
# File lib/rainbows/xepoll_thread_spawn/client.rb, line 84
def handle_error(e)
  super
ensure
  closed? or close
end
kato_delete() click to toggle source
# File lib/rainbows/xepoll_thread_spawn/client.rb, line 43
def kato_delete
  LOCK.synchronize { KATO.delete self }
end
kato_set() click to toggle source
# File lib/rainbows/xepoll_thread_spawn/client.rb, line 38
def kato_set
  LOCK.synchronize { KATO[self] = @@last_expire }
  EP.set(self, IN)
end
pipeline_ready(hp) click to toggle source
# File lib/rainbows/xepoll_thread_spawn/client.rb, line 108
def pipeline_ready(hp)
  hp.parse and return true
  case buf = kgio_tryread(CLIENT_HEADER_BUFFER_SIZE)
  when :wait_readable
    kato_set
    return false
  when String
    hp.add_parse(buf) and return true
    # continue loop
  else
    return close
  end while true
end
spawn(env, hp) click to toggle source
# File lib/rainbows/xepoll_thread_spawn/client.rb, line 104
def spawn(env, hp)
  Thread.new { process_pipeline(env, hp) }
end