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