engineyard-serverside 1.5.23.ruby19.16 → 1.5.24
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/lib/engineyard-serverside.rb +19 -17
- data/lib/engineyard-serverside/cli.rb +38 -30
- data/lib/engineyard-serverside/configuration.rb +4 -28
- data/lib/engineyard-serverside/deploy.rb +10 -7
- data/lib/engineyard-serverside/lockfile_parser.rb +2 -2
- data/lib/engineyard-serverside/logged_output.rb +2 -0
- data/lib/engineyard-serverside/server.rb +2 -27
- data/lib/engineyard-serverside/task.rb +14 -10
- data/lib/engineyard-serverside/version.rb +1 -1
- data/lib/vendor/dataflow/HISTORY +52 -0
- data/lib/vendor/dataflow/LICENSE +19 -0
- data/lib/vendor/dataflow/README.textile +290 -0
- data/lib/vendor/dataflow/Rakefile +36 -0
- data/lib/vendor/dataflow/examples/barrier.rb +9 -0
- data/lib/vendor/dataflow/examples/data_driven.rb +17 -0
- data/lib/vendor/dataflow/examples/dataflow_http_gets.rb +13 -0
- data/lib/vendor/dataflow/examples/flow.rb +20 -0
- data/lib/vendor/dataflow/examples/future_http_gets.rb +12 -0
- data/lib/vendor/dataflow/examples/future_queue.rb +11 -0
- data/lib/vendor/dataflow/examples/instance_variables.rb +15 -0
- data/lib/vendor/dataflow/examples/laziness.rb +9 -0
- data/lib/vendor/dataflow/examples/local_variables.rb +11 -0
- data/lib/vendor/dataflow/examples/messages.rb +26 -0
- data/lib/vendor/dataflow/examples/port_http_gets.rb +13 -0
- data/lib/vendor/dataflow/examples/port_send.rb +10 -0
- data/lib/vendor/dataflow/examples/ring.rb +21 -0
- data/lib/vendor/dataflow/spec/actor_spec.rb +28 -0
- data/lib/vendor/dataflow/spec/anonymous_variables_spec.rb +21 -0
- data/lib/vendor/dataflow/spec/barrier_spec.rb +25 -0
- data/lib/vendor/dataflow/spec/by_need_spec.rb +55 -0
- data/lib/vendor/dataflow/spec/dataflow_spec.rb +151 -0
- data/lib/vendor/dataflow/spec/equality_spec.rb +40 -0
- data/lib/vendor/dataflow/spec/flow_spec.rb +25 -0
- data/lib/vendor/dataflow/spec/forker_spec.rb +28 -0
- data/lib/vendor/dataflow/spec/future_queue_spec.rb +31 -0
- data/lib/vendor/dataflow/spec/inspect_spec.rb +19 -0
- data/lib/vendor/dataflow/spec/need_later_spec.rb +12 -0
- data/lib/vendor/dataflow/spec/port_spec.rb +26 -0
- data/lib/vendor/dataflow/spec/spec.opts +1 -0
- data/lib/vendor/dataflow/spec/spec_helper.rb +10 -0
- data/lib/vendor/escape/Readme +21 -0
- data/lib/vendor/escape/doc_include/template/qualitysmith.rb +631 -0
- data/lib/vendor/json_pure/CHANGES +166 -0
- data/lib/vendor/json_pure/COPYING +58 -0
- data/lib/vendor/json_pure/GPL +340 -0
- data/lib/vendor/json_pure/README +358 -0
- data/lib/vendor/json_pure/Rakefile +292 -0
- data/lib/vendor/json_pure/TODO +1 -0
- data/lib/vendor/json_pure/VERSION +1 -0
- data/lib/vendor/json_pure/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkComparison.log +52 -0
- data/lib/vendor/json_pure/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkExt#generator_fast-autocorrelation.dat +1000 -0
- data/lib/vendor/json_pure/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkExt#generator_fast.dat +1001 -0
- data/lib/vendor/json_pure/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkExt#generator_pretty-autocorrelation.dat +900 -0
- data/lib/vendor/json_pure/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkExt#generator_pretty.dat +901 -0
- data/lib/vendor/json_pure/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkExt#generator_safe-autocorrelation.dat +1000 -0
- data/lib/vendor/json_pure/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkExt#generator_safe.dat +1001 -0
- data/lib/vendor/json_pure/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkExt.log +261 -0
- data/lib/vendor/json_pure/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkPure#generator_fast-autocorrelation.dat +1000 -0
- data/lib/vendor/json_pure/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkPure#generator_fast.dat +1001 -0
- data/lib/vendor/json_pure/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkPure#generator_pretty-autocorrelation.dat +1000 -0
- data/lib/vendor/json_pure/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkPure#generator_pretty.dat +1001 -0
- data/lib/vendor/json_pure/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkPure#generator_safe-autocorrelation.dat +1000 -0
- data/lib/vendor/json_pure/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkPure#generator_safe.dat +1001 -0
- data/lib/vendor/json_pure/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkPure.log +262 -0
- data/lib/vendor/json_pure/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkRails#generator-autocorrelation.dat +1000 -0
- data/lib/vendor/json_pure/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkRails#generator.dat +1001 -0
- data/lib/vendor/json_pure/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkRails.log +82 -0
- data/lib/vendor/json_pure/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkComparison.log +34 -0
- data/lib/vendor/json_pure/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkExt#parser-autocorrelation.dat +900 -0
- data/lib/vendor/json_pure/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkExt#parser.dat +901 -0
- data/lib/vendor/json_pure/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkExt.log +81 -0
- data/lib/vendor/json_pure/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkPure#parser-autocorrelation.dat +1000 -0
- data/lib/vendor/json_pure/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkPure#parser.dat +1001 -0
- data/lib/vendor/json_pure/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkPure.log +82 -0
- data/lib/vendor/json_pure/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkRails#parser-autocorrelation.dat +1000 -0
- data/lib/vendor/json_pure/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkRails#parser.dat +1001 -0
- data/lib/vendor/json_pure/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkRails.log +82 -0
- data/lib/vendor/json_pure/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkYAML#parser-autocorrelation.dat +1000 -0
- data/lib/vendor/json_pure/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkYAML#parser.dat +1001 -0
- data/lib/vendor/json_pure/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkYAML.log +82 -0
- data/lib/vendor/json_pure/benchmarks/generator2_benchmark.rb +222 -0
- data/lib/vendor/json_pure/benchmarks/generator_benchmark.rb +224 -0
- data/lib/vendor/json_pure/benchmarks/ohai.json +1216 -0
- data/lib/vendor/json_pure/benchmarks/ohai.ruby +1 -0
- data/lib/vendor/json_pure/benchmarks/parser2_benchmark.rb +251 -0
- data/lib/vendor/json_pure/benchmarks/parser_benchmark.rb +259 -0
- data/lib/vendor/json_pure/bin/edit_json.rb +9 -0
- data/lib/vendor/json_pure/bin/prettify_json.rb +75 -0
- data/lib/vendor/json_pure/data/example.json +1 -0
- data/lib/vendor/json_pure/data/index.html +38 -0
- data/lib/vendor/json_pure/data/prototype.js +4184 -0
- data/lib/vendor/json_pure/ext/json/ext/generator/extconf.rb +16 -0
- data/lib/vendor/json_pure/ext/json/ext/generator/generator.c +1323 -0
- data/lib/vendor/json_pure/ext/json/ext/generator/generator.h +170 -0
- data/lib/vendor/json_pure/ext/json/ext/parser/extconf.rb +15 -0
- data/lib/vendor/json_pure/ext/json/ext/parser/parser.c +1935 -0
- data/lib/vendor/json_pure/ext/json/ext/parser/parser.h +71 -0
- data/lib/vendor/json_pure/ext/json/ext/parser/parser.rl +792 -0
- data/lib/vendor/json_pure/install.rb +26 -0
- data/lib/vendor/json_pure/tests/fixtures/fail1.json +1 -0
- data/lib/vendor/json_pure/tests/fixtures/fail10.json +1 -0
- data/lib/vendor/json_pure/tests/fixtures/fail11.json +1 -0
- data/lib/vendor/json_pure/tests/fixtures/fail12.json +1 -0
- data/lib/vendor/json_pure/tests/fixtures/fail13.json +1 -0
- data/lib/vendor/json_pure/tests/fixtures/fail14.json +1 -0
- data/lib/vendor/json_pure/tests/fixtures/fail18.json +1 -0
- data/lib/vendor/json_pure/tests/fixtures/fail19.json +1 -0
- data/lib/vendor/json_pure/tests/fixtures/fail2.json +1 -0
- data/lib/vendor/json_pure/tests/fixtures/fail20.json +1 -0
- data/lib/vendor/json_pure/tests/fixtures/fail21.json +1 -0
- data/lib/vendor/json_pure/tests/fixtures/fail22.json +1 -0
- data/lib/vendor/json_pure/tests/fixtures/fail23.json +1 -0
- data/lib/vendor/json_pure/tests/fixtures/fail24.json +1 -0
- data/lib/vendor/json_pure/tests/fixtures/fail25.json +1 -0
- data/lib/vendor/json_pure/tests/fixtures/fail27.json +2 -0
- data/lib/vendor/json_pure/tests/fixtures/fail28.json +2 -0
- data/lib/vendor/json_pure/tests/fixtures/fail3.json +1 -0
- data/lib/vendor/json_pure/tests/fixtures/fail4.json +1 -0
- data/lib/vendor/json_pure/tests/fixtures/fail5.json +1 -0
- data/lib/vendor/json_pure/tests/fixtures/fail6.json +1 -0
- data/lib/vendor/json_pure/tests/fixtures/fail7.json +1 -0
- data/lib/vendor/json_pure/tests/fixtures/fail8.json +1 -0
- data/lib/vendor/json_pure/tests/fixtures/fail9.json +1 -0
- data/lib/vendor/json_pure/tests/fixtures/pass1.json +56 -0
- data/lib/vendor/json_pure/tests/fixtures/pass15.json +1 -0
- data/lib/vendor/json_pure/tests/fixtures/pass16.json +1 -0
- data/lib/vendor/json_pure/tests/fixtures/pass17.json +1 -0
- data/lib/vendor/json_pure/tests/fixtures/pass2.json +1 -0
- data/lib/vendor/json_pure/tests/fixtures/pass26.json +1 -0
- data/lib/vendor/json_pure/tests/fixtures/pass3.json +6 -0
- data/lib/vendor/json_pure/tests/test_json.rb +361 -0
- data/lib/vendor/json_pure/tests/test_json_addition.rb +162 -0
- data/lib/vendor/json_pure/tests/test_json_encoding.rb +68 -0
- data/lib/vendor/json_pure/tests/test_json_fixtures.rb +34 -0
- data/lib/vendor/json_pure/tests/test_json_generate.rb +122 -0
- data/lib/vendor/json_pure/tests/test_json_rails.rb +144 -0
- data/lib/vendor/json_pure/tests/test_json_unicode.rb +76 -0
- data/lib/vendor/json_pure/tools/fuzz.rb +139 -0
- data/lib/vendor/json_pure/tools/server.rb +61 -0
- data/lib/vendor/open4/lib/open4.rb +51 -80
- data/lib/vendor/thor/CHANGELOG.rdoc +89 -0
- data/lib/vendor/thor/LICENSE +20 -0
- data/lib/vendor/thor/README.rdoc +297 -0
- data/lib/vendor/thor/Thorfile +69 -0
- data/lib/vendor/thor/bin/rake2thor +86 -0
- data/lib/vendor/thor/bin/thor +6 -0
- data/lib/vendor/thor/thor.gemspec +120 -0
- data/spec/basic_deploy_spec.rb +1 -1
- data/spec/bundler_deploy_spec.rb +1 -1
- data/spec/nodejs_deploy_spec.rb +5 -2
- data/spec/rails31_deploy_spec.rb +3 -3
- data/spec/services_deploy_spec.rb +1 -1
- data/spec/support/integration.rb +1 -2
- metadata +165 -44
- data/lib/engineyard-serverside/future.rb +0 -29
- data/lib/engineyard-serverside/futures/celluloid.rb +0 -25
- data/lib/engineyard-serverside/futures/dataflow.rb +0 -31
- data/lib/vendor/celluloid/lib/celluloid.rb +0 -261
- data/lib/vendor/celluloid/lib/celluloid/actor.rb +0 -242
- data/lib/vendor/celluloid/lib/celluloid/actor_pool.rb +0 -54
- data/lib/vendor/celluloid/lib/celluloid/actor_proxy.rb +0 -75
- data/lib/vendor/celluloid/lib/celluloid/application.rb +0 -78
- data/lib/vendor/celluloid/lib/celluloid/calls.rb +0 -94
- data/lib/vendor/celluloid/lib/celluloid/core_ext.rb +0 -14
- data/lib/vendor/celluloid/lib/celluloid/events.rb +0 -14
- data/lib/vendor/celluloid/lib/celluloid/fiber.rb +0 -33
- data/lib/vendor/celluloid/lib/celluloid/fsm.rb +0 -141
- data/lib/vendor/celluloid/lib/celluloid/future.rb +0 -60
- data/lib/vendor/celluloid/lib/celluloid/links.rb +0 -61
- data/lib/vendor/celluloid/lib/celluloid/logger.rb +0 -32
- data/lib/vendor/celluloid/lib/celluloid/mailbox.rb +0 -124
- data/lib/vendor/celluloid/lib/celluloid/receivers.rb +0 -66
- data/lib/vendor/celluloid/lib/celluloid/registry.rb +0 -33
- data/lib/vendor/celluloid/lib/celluloid/responses.rb +0 -26
- data/lib/vendor/celluloid/lib/celluloid/rspec.rb +0 -2
- data/lib/vendor/celluloid/lib/celluloid/signals.rb +0 -50
- data/lib/vendor/celluloid/lib/celluloid/supervisor.rb +0 -57
- data/lib/vendor/celluloid/lib/celluloid/task.rb +0 -73
- data/lib/vendor/celluloid/lib/celluloid/tcp_server.rb +0 -33
- data/lib/vendor/celluloid/lib/celluloid/timers.rb +0 -109
- data/lib/vendor/celluloid/lib/celluloid/version.rb +0 -4
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
module Celluloid
|
|
2
|
-
# Supervisors are actors that watch over other actors and restart them if
|
|
3
|
-
# they crash
|
|
4
|
-
class Supervisor
|
|
5
|
-
include Celluloid
|
|
6
|
-
trap_exit :restart_actor
|
|
7
|
-
|
|
8
|
-
# Retrieve the actor this supervisor is supervising
|
|
9
|
-
attr_reader :actor
|
|
10
|
-
|
|
11
|
-
def self.supervise(klass, *args, &block)
|
|
12
|
-
new(nil, klass, *args, &block)
|
|
13
|
-
end
|
|
14
|
-
|
|
15
|
-
def self.supervise_as(name, klass, *args, &block)
|
|
16
|
-
new(name, klass, *args, &block)
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
def initialize(name, klass, *args, &block)
|
|
20
|
-
@name, @klass, @args, @block = name, klass, args, block
|
|
21
|
-
@started = false
|
|
22
|
-
|
|
23
|
-
start_actor
|
|
24
|
-
end
|
|
25
|
-
|
|
26
|
-
def start_actor(start_attempts = 3, sleep_interval = 30)
|
|
27
|
-
failures = 0
|
|
28
|
-
|
|
29
|
-
begin
|
|
30
|
-
@actor = @klass.new_link(*@args, &@block)
|
|
31
|
-
rescue => ex
|
|
32
|
-
failures += 1
|
|
33
|
-
if failures >= start_attempts
|
|
34
|
-
failures = 0
|
|
35
|
-
|
|
36
|
-
Logger.warn("#{@klass} is crashing on initialize too quickly, sleeping for #{sleep_interval} seconds")
|
|
37
|
-
sleep sleep_interval
|
|
38
|
-
end
|
|
39
|
-
retry
|
|
40
|
-
end
|
|
41
|
-
|
|
42
|
-
@started = true
|
|
43
|
-
Actor[@name] = @actor if @name
|
|
44
|
-
end
|
|
45
|
-
|
|
46
|
-
# When actors die, regardless of the reason, restart them
|
|
47
|
-
def restart_actor(actor, reason)
|
|
48
|
-
start_actor if @started
|
|
49
|
-
end
|
|
50
|
-
|
|
51
|
-
def inspect
|
|
52
|
-
str = "#<#{self.class}(#{@klass}):0x#{object_id.to_s(16)}"
|
|
53
|
-
str << " " << @args.map { |arg| arg.inspect }.join(' ') unless @args.empty?
|
|
54
|
-
str << ">"
|
|
55
|
-
end
|
|
56
|
-
end
|
|
57
|
-
end
|
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
module Celluloid
|
|
2
|
-
# Trying to resume a dead task
|
|
3
|
-
class DeadTaskError < StandardError; end
|
|
4
|
-
|
|
5
|
-
# Tasks are interruptable/resumable execution contexts used to run methods
|
|
6
|
-
class Task
|
|
7
|
-
class TerminatedError < StandardError; end # kill a running fiber
|
|
8
|
-
|
|
9
|
-
attr_reader :type # what type of task is this?
|
|
10
|
-
|
|
11
|
-
# Obtain the current task
|
|
12
|
-
def self.current
|
|
13
|
-
task = Fiber.current.task
|
|
14
|
-
raise "not in task scope" unless task
|
|
15
|
-
task
|
|
16
|
-
end
|
|
17
|
-
|
|
18
|
-
# Suspend the running task, deferring to the scheduler
|
|
19
|
-
def self.suspend(value = nil)
|
|
20
|
-
result = Fiber.yield(value)
|
|
21
|
-
raise TerminatedError, "task was terminated" if result == TerminatedError
|
|
22
|
-
result
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
# Run the given block within a task
|
|
26
|
-
def initialize(type)
|
|
27
|
-
@type = type
|
|
28
|
-
|
|
29
|
-
actor = Thread.current[:actor]
|
|
30
|
-
mailbox = Thread.current[:mailbox]
|
|
31
|
-
|
|
32
|
-
@fiber = Fiber.new do
|
|
33
|
-
Thread.current[:actor] = actor
|
|
34
|
-
Thread.current[:mailbox] = mailbox
|
|
35
|
-
|
|
36
|
-
Fiber.current.task = self
|
|
37
|
-
|
|
38
|
-
begin
|
|
39
|
-
yield
|
|
40
|
-
rescue TerminatedError
|
|
41
|
-
# Task was explicitly terminated
|
|
42
|
-
end
|
|
43
|
-
end
|
|
44
|
-
end
|
|
45
|
-
|
|
46
|
-
# Resume a suspended task, giving it a value to return if needed
|
|
47
|
-
def resume(value = nil)
|
|
48
|
-
@fiber.resume value
|
|
49
|
-
nil
|
|
50
|
-
rescue FiberError
|
|
51
|
-
raise DeadTaskError, "cannot resume a dead task"
|
|
52
|
-
rescue RuntimeError => ex
|
|
53
|
-
# These occur spuriously on 1.9.3 if we shut down an actor with running tasks
|
|
54
|
-
return if ex.message == ""
|
|
55
|
-
raise
|
|
56
|
-
end
|
|
57
|
-
|
|
58
|
-
# Terminate this task
|
|
59
|
-
def terminate
|
|
60
|
-
resume TerminatedError
|
|
61
|
-
rescue FiberError
|
|
62
|
-
# If we're getting this the task should already be dead
|
|
63
|
-
end
|
|
64
|
-
|
|
65
|
-
# Is the current task still running?
|
|
66
|
-
def running?; @fiber.alive?; end
|
|
67
|
-
|
|
68
|
-
# Nicer string inspect for tasks
|
|
69
|
-
def inspect
|
|
70
|
-
"<Celluloid::Task:0x#{object_id.to_s(16)} @type=#{@type.inspect}, @running=#{@fiber.alive?}>"
|
|
71
|
-
end
|
|
72
|
-
end
|
|
73
|
-
end
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
require 'socket'
|
|
2
|
-
|
|
3
|
-
module Celluloid
|
|
4
|
-
# A TCPServer that runs as an actor
|
|
5
|
-
class TCPServer
|
|
6
|
-
include Celluloid::IO
|
|
7
|
-
|
|
8
|
-
# Bind a TCP server to the given host and port
|
|
9
|
-
def initialize(host, port)
|
|
10
|
-
@server = ::TCPServer.new host, port
|
|
11
|
-
run!
|
|
12
|
-
end
|
|
13
|
-
|
|
14
|
-
# Run the TCP server event loop
|
|
15
|
-
def run
|
|
16
|
-
while true
|
|
17
|
-
wait_readable(@server)
|
|
18
|
-
on_connect @server.accept
|
|
19
|
-
end
|
|
20
|
-
end
|
|
21
|
-
|
|
22
|
-
# Terminate this server
|
|
23
|
-
def terminate
|
|
24
|
-
@server.close
|
|
25
|
-
super
|
|
26
|
-
end
|
|
27
|
-
|
|
28
|
-
# Called whenever a new connection is opened
|
|
29
|
-
def on_connect(connection)
|
|
30
|
-
connection.close
|
|
31
|
-
end
|
|
32
|
-
end
|
|
33
|
-
end
|
|
@@ -1,109 +0,0 @@
|
|
|
1
|
-
module Celluloid
|
|
2
|
-
# Low precision timers implemented in pure Ruby
|
|
3
|
-
class Timers
|
|
4
|
-
def initialize
|
|
5
|
-
@timers = []
|
|
6
|
-
end
|
|
7
|
-
|
|
8
|
-
# Call the given block after the given interval
|
|
9
|
-
def add(interval, &block)
|
|
10
|
-
Timer.new(self, interval, block)
|
|
11
|
-
end
|
|
12
|
-
|
|
13
|
-
# Wait for the next timer and fire it
|
|
14
|
-
def wait
|
|
15
|
-
return if @timers.empty?
|
|
16
|
-
|
|
17
|
-
interval = wait_interval
|
|
18
|
-
sleep interval if interval >= Timer::QUANTUM
|
|
19
|
-
fire
|
|
20
|
-
end
|
|
21
|
-
|
|
22
|
-
# Interval to wait until when the next timer will fire
|
|
23
|
-
def wait_interval
|
|
24
|
-
@timers.first.time - Time.now unless empty?
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
# Fire all timers that are ready
|
|
28
|
-
def fire
|
|
29
|
-
return if @timers.empty?
|
|
30
|
-
|
|
31
|
-
time = Time.now + Timer::QUANTUM
|
|
32
|
-
while not empty? and time > @timers.first.time
|
|
33
|
-
timer = @timers.shift
|
|
34
|
-
timer.call
|
|
35
|
-
end
|
|
36
|
-
end
|
|
37
|
-
|
|
38
|
-
# Insert a timer into the active timers
|
|
39
|
-
def insert(timer)
|
|
40
|
-
@timers.insert(index(timer), timer)
|
|
41
|
-
end
|
|
42
|
-
|
|
43
|
-
# Remove a given timer from the set we're monitoring
|
|
44
|
-
def cancel(timer)
|
|
45
|
-
@timers.delete timer
|
|
46
|
-
end
|
|
47
|
-
|
|
48
|
-
# Are there any timers pending?
|
|
49
|
-
def empty?
|
|
50
|
-
@timers.empty?
|
|
51
|
-
end
|
|
52
|
-
|
|
53
|
-
# Index where a timer would be located in the sorted timers array
|
|
54
|
-
def index(timer)
|
|
55
|
-
l, r = 0, @timers.size - 1
|
|
56
|
-
|
|
57
|
-
while l <= r
|
|
58
|
-
m = (r + l) / 2
|
|
59
|
-
if timer < @timers.at(m)
|
|
60
|
-
r = m - 1
|
|
61
|
-
else
|
|
62
|
-
l = m + 1
|
|
63
|
-
end
|
|
64
|
-
end
|
|
65
|
-
l
|
|
66
|
-
end
|
|
67
|
-
end
|
|
68
|
-
|
|
69
|
-
# An individual timer set to fire a given proc at a given time
|
|
70
|
-
class Timer
|
|
71
|
-
include Comparable
|
|
72
|
-
|
|
73
|
-
# The timer system is guaranteed (at least by the specs) to be this precise
|
|
74
|
-
# during normal operation. Long blocking calls within actors will delay the
|
|
75
|
-
# firing of timers
|
|
76
|
-
QUANTUM = 0.02
|
|
77
|
-
|
|
78
|
-
attr_reader :interval, :time
|
|
79
|
-
|
|
80
|
-
def initialize(timers, interval, block)
|
|
81
|
-
@timers, @interval = timers, interval
|
|
82
|
-
@block = block
|
|
83
|
-
|
|
84
|
-
reset
|
|
85
|
-
end
|
|
86
|
-
|
|
87
|
-
def <=>(other)
|
|
88
|
-
@time <=> other.time
|
|
89
|
-
end
|
|
90
|
-
|
|
91
|
-
# Cancel this timer
|
|
92
|
-
def cancel
|
|
93
|
-
@timers.cancel self
|
|
94
|
-
end
|
|
95
|
-
|
|
96
|
-
# Reset this timer
|
|
97
|
-
def reset
|
|
98
|
-
@timers.cancel self if defined?(@time)
|
|
99
|
-
@time = Time.now + @interval
|
|
100
|
-
@timers.insert self
|
|
101
|
-
end
|
|
102
|
-
|
|
103
|
-
# Fire the block
|
|
104
|
-
def fire
|
|
105
|
-
@block.call
|
|
106
|
-
end
|
|
107
|
-
alias_method :call, :fire
|
|
108
|
-
end
|
|
109
|
-
end
|