1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
| | # -*- encoding: binary -*-
require 'rainbows'
module Rainbows
class HttpServer < ::Unicorn::HttpServer
include Rainbows
@@instance = nil
class << self
def setup(block)
@@instance.instance_eval(&block)
end
end
def initialize(app, options)
@@instance = self
rv = super(app, options)
defined?(@use) or use(:Base)
@worker_connections ||= MODEL_WORKER_CONNECTIONS[@use]
end
#:stopdoc:
#
# Add one second to the timeout since our fchmod heartbeat is less
# precise (and must be more conservative) than Unicorn does. We
# handle many clients per process and can't chmod on every
# connection we accept without wasting cycles. That added to the
# fact that we let clients keep idle connections open for long
# periods of time means we have to chmod at a fixed interval.
alias_method :set_timeout, :timeout=
undef_method :timeout=
def timeout=(nr)
set_timeout(nr + 1)
end
#:startdoc:
def use(*args)
model = args.shift or return @use
mod = begin
Rainbows.const_get(model)
rescue NameError
raise ArgumentError, "concurrency model #{model.inspect} not supported"
end
Module === mod or
raise ArgumentError, "concurrency model #{model.inspect} not supported"
extend(mod)
Const::RACK_DEFAULTS['rainbows.model'] = @use = model.to_sym
Const::RACK_DEFAULTS['rack.multithread'] = !!(/Thread/ =~ model.to_s)
case @use
when :Rev, :EventMachine
Const::RACK_DEFAULTS['rainbows.autochunk'] = true
end
end
def worker_connections(*args)
return @worker_connections if args.empty?
nr = args.first
(Integer === nr && nr > 0) or
raise ArgumentError, "worker_connections must be a positive Integer"
@worker_connections = nr
end
end
end
|