preliminary Rack app to track last_data_recv
[raindrops.git] / lib / raindrops / aggregate / last_data_recv.rb
blob29359277de2782a072daec0d7adac89a6ed0eb8c
1 # -*- encoding: binary -*-
2 require "socket"
4 # Used to aggregate last_data_recv times
5 module Raindrops::Aggregate::LastDataRecv
6   TCP_Info = Raindrops::TCP_Info
7   attr_accessor :raindrops_aggregate
8   @@default_aggregate = nil
10   def self.default_aggregate
11     @@default_aggregate ||= Raindrops::Aggregate::PMQ.new
12   end
14   def self.default_aggregate=(agg)
15     @@default_aggregate = agg
16   end
18   def self.cornify!
19     Unicorn::HttpServer::LISTENERS.each do |sock|
20       sock.extend(self) if TCPServer === sock
21     end
22   end
24   def self.extended(obj)
25     obj.raindrops_aggregate = default_aggregate
26     obj.setsockopt Socket::SOL_TCP, tcp_defer_accept = 9, seconds = 60
27   end
29   def kgio_tryaccept(*args)
30     count! super
31   end
33   def kgio_accept(*args)
34     count! super
35   end
37   def accept
38     count! super
39   end
41   def accept_nonblock
42     count! super
43   end
45   def count!(io)
46     if io
47       x = TCP_Info.new(io)
48       @raindrops_aggregate << x.last_data_recv
49     end
50     io
51   end
52 end