celluloid 0.17.4 → 0.18.0
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.
- checksums.yaml +4 -4
- data/CHANGES.md +300 -81
- data/CONDUCT.md +13 -0
- data/CONTRIBUTING.md +39 -0
- data/README.md +54 -155
- data/REFACTOR.md +1 -0
- data/architecture.md +120 -0
- data/examples/basic_usage.rb +1 -1
- data/examples/configurations.rb +78 -0
- data/examples/futures.rb +1 -1
- data/examples/ring.rb +5 -4
- data/examples/simple_pmap.rb +1 -1
- data/examples/stack.rb +2 -2
- data/examples/supervisors_and_registry.rb +82 -0
- data/examples/timers.rb +2 -2
- data/lib/celluloid/actor/system.rb +13 -29
- data/lib/celluloid/actor.rb +27 -17
- data/lib/celluloid/autostart.rb +6 -1
- data/lib/celluloid/call/async.rb +2 -0
- data/lib/celluloid/call/sync.rb +10 -3
- data/lib/celluloid/calls.rb +13 -12
- data/lib/celluloid/cell.rb +5 -9
- data/lib/celluloid/condition.rb +3 -3
- data/lib/celluloid/core_ext.rb +0 -2
- data/lib/celluloid/debug.rb +3 -0
- data/lib/celluloid/exceptions.rb +2 -2
- data/lib/celluloid/future.rb +8 -10
- data/lib/celluloid/group/pool.rb +1 -3
- data/lib/celluloid/group/spawner.rb +2 -6
- data/lib/celluloid/group.rb +12 -8
- data/lib/celluloid/internals/call_chain.rb +15 -0
- data/lib/celluloid/internals/cpu_counter.rb +62 -0
- data/lib/celluloid/internals/handlers.rb +42 -0
- data/lib/celluloid/internals/links.rb +38 -0
- data/lib/celluloid/internals/logger.rb +104 -0
- data/lib/celluloid/internals/method.rb +34 -0
- data/lib/celluloid/internals/properties.rb +32 -0
- data/lib/celluloid/internals/receivers.rb +64 -0
- data/lib/celluloid/internals/registry.rb +102 -0
- data/lib/celluloid/internals/responses.rb +46 -0
- data/lib/celluloid/internals/signals.rb +24 -0
- data/lib/celluloid/internals/stack/dump.rb +12 -0
- data/lib/celluloid/internals/stack/states.rb +72 -0
- data/lib/celluloid/internals/stack/summary.rb +12 -0
- data/lib/celluloid/internals/stack.rb +74 -0
- data/lib/celluloid/internals/task_set.rb +51 -0
- data/lib/celluloid/internals/thread_handle.rb +52 -0
- data/lib/celluloid/internals/uuid.rb +40 -0
- data/lib/celluloid/logging/incident.rb +21 -0
- data/lib/celluloid/logging/incident_logger.rb +147 -0
- data/lib/celluloid/logging/incident_reporter.rb +49 -0
- data/lib/celluloid/logging/log_event.rb +20 -0
- data/lib/celluloid/logging/ring_buffer.rb +64 -0
- data/lib/celluloid/mailbox/evented.rb +13 -5
- data/lib/celluloid/mailbox.rb +22 -9
- data/lib/celluloid/notifications.rb +95 -0
- data/lib/celluloid/pool.rb +6 -0
- data/lib/celluloid/probe.rb +81 -0
- data/lib/celluloid/proxy/abstract.rb +9 -9
- data/lib/celluloid/proxy/async.rb +1 -1
- data/lib/celluloid/proxy/block.rb +2 -2
- data/lib/celluloid/proxy/cell.rb +1 -1
- data/lib/celluloid/proxy/future.rb +2 -4
- data/lib/celluloid/proxy/sync.rb +1 -3
- data/lib/celluloid/rspec.rb +22 -33
- data/lib/celluloid/supervision/configuration/injections.rb +8 -0
- data/lib/celluloid/supervision/configuration/instance.rb +113 -0
- data/lib/celluloid/supervision/configuration.rb +169 -0
- data/lib/celluloid/supervision/constants.rb +123 -0
- data/lib/celluloid/supervision/container/behavior/pool.rb +71 -0
- data/lib/celluloid/supervision/container/behavior/tree.rb +23 -0
- data/lib/celluloid/supervision/container/behavior.rb +89 -0
- data/lib/celluloid/supervision/container/injections.rb +8 -0
- data/lib/celluloid/supervision/container/instance.rb +116 -0
- data/lib/celluloid/supervision/container/pool.rb +210 -0
- data/lib/celluloid/supervision/container.rb +144 -0
- data/lib/celluloid/supervision/service.rb +27 -0
- data/lib/celluloid/supervision/supervise.rb +34 -0
- data/lib/celluloid/supervision/validation.rb +40 -0
- data/lib/celluloid/supervision/version.rb +5 -0
- data/lib/celluloid/supervision.rb +17 -0
- data/lib/celluloid/system_events.rb +11 -6
- data/lib/celluloid/task/fibered.rb +6 -2
- data/lib/celluloid/task/threaded.rb +3 -3
- data/lib/celluloid/task.rb +25 -12
- data/lib/celluloid/test.rb +5 -2
- data/lib/celluloid/thread.rb +0 -2
- data/lib/celluloid/version.rb +1 -1
- data/lib/celluloid.rb +74 -64
- data/spec/celluloid/block_spec.rb +29 -32
- data/spec/celluloid/calls_spec.rb +5 -15
- data/spec/celluloid/future_spec.rb +7 -1
- data/spec/celluloid/internals/cpu_counter_spec.rb +129 -0
- data/spec/celluloid/internals/links_spec.rb +43 -0
- data/spec/celluloid/internals/properties_spec.rb +40 -0
- data/spec/celluloid/internals/registry_spec.rb +62 -0
- data/spec/celluloid/internals/stack/dump_spec.rb +4 -0
- data/spec/celluloid/internals/stack/summary_spec.rb +4 -0
- data/spec/celluloid/internals/thread_handle_spec.rb +60 -0
- data/spec/celluloid/internals/uuid_spec.rb +9 -0
- data/spec/celluloid/logging/ring_buffer_spec.rb +36 -0
- data/spec/celluloid/mailbox/evented_spec.rb +11 -22
- data/spec/celluloid/misc/leak_spec.rb +3 -4
- data/spec/celluloid/notifications_spec.rb +140 -0
- data/spec/celluloid/probe_spec.rb +102 -0
- data/spec/celluloid/proxy_spec.rb +30 -30
- data/spec/celluloid/supervision/behavior_spec.rb +74 -0
- data/spec/celluloid/supervision/configuration_spec.rb +181 -0
- data/spec/celluloid/supervision/container_spec.rb +72 -0
- data/spec/celluloid/supervision/instance_spec.rb +13 -0
- data/spec/celluloid/supervision/root_spec.rb +28 -0
- data/spec/celluloid/supervision/supervisor_spec.rb +93 -0
- data/spec/celluloid/task/fibered_spec.rb +1 -3
- data/spec/celluloid/task/threaded_spec.rb +1 -3
- data/spec/shared/actor_examples.rb +58 -33
- data/spec/shared/group_examples.rb +2 -2
- data/spec/shared/mailbox_examples.rb +1 -1
- data/spec/shared/stack_examples.rb +87 -0
- data/spec/shared/task_examples.rb +2 -3
- data/spec/spec_helper.rb +2 -4
- data/spec/support/configure_rspec.rb +2 -3
- data/spec/support/coverage.rb +2 -4
- data/spec/support/crash_checking.rb +2 -2
- data/spec/support/examples/actor_class.rb +3 -8
- data/spec/support/examples/call_class.rb +2 -2
- data/spec/support/examples/container_class.rb +35 -0
- data/spec/support/examples/evented_mailbox_class.rb +1 -2
- data/spec/support/examples/stack_classes.rb +58 -0
- data/spec/support/examples/stack_methods.rb +23 -0
- data/spec/support/examples/subordinate_class.rb +19 -0
- data/spec/support/logging.rb +3 -34
- data/spec/support/loose_threads.rb +3 -16
- data/spec/support/reset_class_variables.rb +5 -1
- data/spec/support/stubbing.rb +1 -1
- metadata +91 -289
- data/culture/CONDUCT.md +0 -28
- data/culture/Gemfile +0 -9
- data/culture/LICENSE.txt +0 -22
- data/culture/README.md +0 -22
- data/culture/Rakefile +0 -5
- data/culture/SYNC.md +0 -70
- data/culture/celluloid-culture.gemspec +0 -18
- data/culture/gems/README.md +0 -39
- data/culture/gems/dependencies.yml +0 -85
- data/culture/gems/loader.rb +0 -101
- data/culture/rubocop/README.md +0 -38
- data/culture/rubocop/lint.yml +0 -8
- data/culture/rubocop/metrics.yml +0 -15
- data/culture/rubocop/perf.yml +0 -0
- data/culture/rubocop/rubocop.yml +0 -5
- data/culture/rubocop/style.yml +0 -57
- data/culture/spec/gems_spec.rb +0 -2
- data/culture/spec/spec_helper.rb +0 -0
- data/culture/spec/sync_spec.rb +0 -2
- data/culture/sync.rb +0 -56
- data/culture/tasks/rspec.rake +0 -5
- data/culture/tasks/rubocop.rake +0 -2
- data/lib/celluloid/actor/manager.rb +0 -7
- data/lib/celluloid/backported.rb +0 -2
- data/lib/celluloid/current.rb +0 -2
- data/lib/celluloid/deprecate.rb +0 -21
- data/lib/celluloid/fiber.rb +0 -32
- data/lib/celluloid/managed.rb +0 -3
- data/lib/celluloid/notices.rb +0 -15
- data/spec/deprecate/actor_system_spec.rb +0 -72
- data/spec/deprecate/block_spec.rb +0 -52
- data/spec/deprecate/calls_spec.rb +0 -39
- data/spec/deprecate/evented_mailbox_spec.rb +0 -34
- data/spec/deprecate/future_spec.rb +0 -32
- data/spec/deprecate/internal_pool_spec.rb +0 -4
- data/spec/support/env.rb +0 -21
@@ -0,0 +1,34 @@
|
|
1
|
+
# collect together all instances of the `supervise` method
|
2
|
+
module Celluloid
|
3
|
+
class << self
|
4
|
+
def supervise(config = {}, &block)
|
5
|
+
supervisor = Supervision.router(config)
|
6
|
+
supervisor.supervise(config, &block)
|
7
|
+
end
|
8
|
+
end
|
9
|
+
module ClassMethods
|
10
|
+
def supervise(config = {}, &block)
|
11
|
+
Celluloid.supervise(config.merge(type: self), &block)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
module Supervision
|
15
|
+
class << self
|
16
|
+
def router(_config = {})
|
17
|
+
# TODO: Actually route.
|
18
|
+
Celluloid.services # for now, hardcode .services
|
19
|
+
end
|
20
|
+
end
|
21
|
+
class Container
|
22
|
+
class << self
|
23
|
+
def supervise(config, &block)
|
24
|
+
blocks << lambda do |container|
|
25
|
+
container.add(config, &block)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
def supervise(config, &block)
|
30
|
+
add(Configuration.options(config, block: block))
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
module Celluloid
|
2
|
+
module Supervision
|
3
|
+
class Configuration
|
4
|
+
class << self
|
5
|
+
def valid?(configuration, fails = false)
|
6
|
+
parameters(:mandatory).each do |k|
|
7
|
+
unless configuration.key? k
|
8
|
+
if fails
|
9
|
+
raise Error::Incomplete, "Missing `:#{k}` in supervision configuration."
|
10
|
+
else
|
11
|
+
return false
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
arity.each do |klass, args|
|
16
|
+
next if configuration[args].is_a? Proc
|
17
|
+
__a = configuration[args] && configuration[args].count || 0
|
18
|
+
__arity = configuration[klass].allocate.method(:initialize).arity
|
19
|
+
unless (__arity < 0 && __a >= __arity.abs - 1) || __a == __arity.abs
|
20
|
+
if fails
|
21
|
+
raise ArgumentError, "#{__a} vs. #{__arity}"
|
22
|
+
else
|
23
|
+
return false
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
true
|
28
|
+
end
|
29
|
+
|
30
|
+
def options(config = {}, options = {})
|
31
|
+
configuration = config.merge(options)
|
32
|
+
return configuration if configuration.is_a? Configuration
|
33
|
+
configuration[:configuration] = Container::Behavior.configure(configuration)
|
34
|
+
valid?(configuration, true)
|
35
|
+
configuration
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require "celluloid" unless defined? Celluloid
|
2
|
+
|
3
|
+
require "celluloid/supervision/constants"
|
4
|
+
require "celluloid/supervision/supervise"
|
5
|
+
|
6
|
+
require "celluloid/supervision/container"
|
7
|
+
require "celluloid/supervision/container/instance"
|
8
|
+
require "celluloid/supervision/container/behavior"
|
9
|
+
require "celluloid/supervision/container/injections"
|
10
|
+
|
11
|
+
require "celluloid/supervision/container/behavior/tree"
|
12
|
+
|
13
|
+
require "celluloid/supervision/validation"
|
14
|
+
require "celluloid/supervision/configuration"
|
15
|
+
require "celluloid/supervision/configuration/instance"
|
16
|
+
|
17
|
+
require "celluloid/supervision/service"
|
@@ -5,7 +5,10 @@ module Celluloid
|
|
5
5
|
if handler = SystemEvent.handle(event.class)
|
6
6
|
send(handler, event)
|
7
7
|
else
|
8
|
+
# !!! DO NOT INTRODUCE ADDITIONAL GLOBAL VARIABLES !!!
|
9
|
+
# rubocop:disable Style/GlobalVars
|
8
10
|
Internals::Logger.debug "Discarded message (unhandled): #{message}" if $CELLULOID_DEBUG
|
11
|
+
# rubocop:enable Style/GlobalVars
|
9
12
|
end
|
10
13
|
end
|
11
14
|
end
|
@@ -18,7 +21,7 @@ module Celluloid
|
|
18
21
|
end
|
19
22
|
|
20
23
|
def handler(&block)
|
21
|
-
|
24
|
+
raise ArgumentError, "SystemEvent handlers must be defined with a block." unless block
|
22
25
|
method = begin
|
23
26
|
handler = name
|
24
27
|
.split("::").last
|
@@ -38,7 +41,7 @@ module Celluloid
|
|
38
41
|
def initialize(actor, type)
|
39
42
|
@actor = actor
|
40
43
|
@type = type.to_sym
|
41
|
-
|
44
|
+
raise ArgumentError, "type must be link or unlink" unless %i[link unlink].include?(@type)
|
42
45
|
end
|
43
46
|
end
|
44
47
|
end
|
@@ -87,7 +90,11 @@ module Celluloid
|
|
87
90
|
|
88
91
|
handler do |event|
|
89
92
|
@name = event.name
|
93
|
+
|
94
|
+
# !!! DO NOT INTRODUCE ADDITIONAL GLOBAL VARIABLES !!!
|
95
|
+
# rubocop:disable Style/GlobalVars
|
90
96
|
Celluloid::Probe.actor_named(self) if $CELLULOID_MONITORING
|
97
|
+
# rubocop:enable Style/GlobalVars
|
91
98
|
end
|
92
99
|
|
93
100
|
def initialize(name)
|
@@ -97,7 +104,7 @@ module Celluloid
|
|
97
104
|
|
98
105
|
# Request for an actor to terminate
|
99
106
|
class TerminationRequest < SystemEvent
|
100
|
-
handler do |
|
107
|
+
handler do |_event|
|
101
108
|
terminate
|
102
109
|
end
|
103
110
|
end
|
@@ -110,9 +117,7 @@ module Celluloid
|
|
110
117
|
end
|
111
118
|
attr_reader :task, :value
|
112
119
|
|
113
|
-
handler
|
114
|
-
event.call
|
115
|
-
end
|
120
|
+
handler(&:call)
|
116
121
|
|
117
122
|
def call
|
118
123
|
@task.resume(@value)
|
@@ -12,8 +12,10 @@ module Celluloid
|
|
12
12
|
Thread.current[:celluloid_queue] = queue
|
13
13
|
Thread.current[:celluloid_actor_system] = actor_system
|
14
14
|
yield
|
15
|
-
|
16
|
-
|
15
|
+
|
16
|
+
# Alleged workaround for a MRI memory leak
|
17
|
+
# TODO: validate/confirm this is actually necessary
|
18
|
+
Fiber.yield if RUBY_ENGINE == "ruby"
|
17
19
|
end
|
18
20
|
end
|
19
21
|
|
@@ -38,7 +40,9 @@ module Celluloid
|
|
38
40
|
end
|
39
41
|
|
40
42
|
def backtrace
|
43
|
+
# rubocop:disable Metrics/LineLength
|
41
44
|
["#{self.class} backtrace unavailable. Please try `Celluloid.task_class = Celluloid::Task::Threaded` if you need backtraces here."]
|
45
|
+
# rubocop:enable Metrics/LineLength
|
42
46
|
end
|
43
47
|
end
|
44
48
|
end
|
@@ -18,7 +18,7 @@ module Celluloid
|
|
18
18
|
thread = Internals::ThreadHandle.new(Thread.current[:celluloid_actor_system], :task) do
|
19
19
|
begin
|
20
20
|
ex = @resume_queue.pop
|
21
|
-
|
21
|
+
raise ex if ex.is_a?(TaskTerminated)
|
22
22
|
|
23
23
|
yield
|
24
24
|
rescue ::Exception => ex
|
@@ -40,12 +40,12 @@ module Celluloid
|
|
40
40
|
end
|
41
41
|
|
42
42
|
def deliver(value)
|
43
|
-
|
43
|
+
raise DeadTaskError, "cannot resume a dead task" unless @thread.alive?
|
44
44
|
|
45
45
|
@yield_mutex.synchronize do
|
46
46
|
@resume_queue.push(value)
|
47
47
|
@yield_cond.wait(@yield_mutex)
|
48
|
-
|
48
|
+
raise @exception_queue.pop until @exception_queue.empty?
|
49
49
|
end
|
50
50
|
rescue ThreadError
|
51
51
|
raise DeadTaskError, "cannot resume a dead task"
|
data/lib/celluloid/task.rb
CHANGED
@@ -3,7 +3,7 @@ module Celluloid
|
|
3
3
|
class Task
|
4
4
|
# Obtain the current task
|
5
5
|
def self.current
|
6
|
-
Thread.current[:celluloid_task] ||
|
6
|
+
Thread.current[:celluloid_task] || raise(NotTaskError, "not within a task context")
|
7
7
|
end
|
8
8
|
|
9
9
|
# Suspend the running task, deferring to the scheduler
|
@@ -27,7 +27,7 @@ module Celluloid
|
|
27
27
|
actor = Thread.current[:celluloid_actor]
|
28
28
|
@chain_id = Internals::CallChain.current_id
|
29
29
|
|
30
|
-
|
30
|
+
raise NotActorError, "can't create tasks outside of actors" unless actor
|
31
31
|
guard "can't create tasks inside of tasks" if Thread.current[:celluloid_task]
|
32
32
|
|
33
33
|
create do
|
@@ -53,26 +53,29 @@ module Celluloid
|
|
53
53
|
end
|
54
54
|
|
55
55
|
def create(&_block)
|
56
|
-
|
56
|
+
raise "Implement #{self.class}#create"
|
57
57
|
end
|
58
58
|
|
59
59
|
# Suspend the current task, changing the status to the given argument
|
60
60
|
def suspend(status)
|
61
|
-
|
62
|
-
|
61
|
+
raise "Cannot suspend while in exclusive mode" if exclusive?
|
62
|
+
raise "Cannot suspend a task from outside of itself" unless Task.current == self
|
63
63
|
|
64
64
|
@status = status
|
65
65
|
|
66
|
+
# !!! DO NOT INTRODUCE ADDITIONAL GLOBAL VARIABLES !!!
|
67
|
+
# rubocop:disable Style/GlobalVars
|
66
68
|
if $CELLULOID_DEBUG && @dangerous_suspend
|
67
69
|
Internals::Logger.with_backtrace(caller[2...8]) do |logger|
|
68
70
|
logger.warn "Dangerously suspending task: type=#{@type.inspect}, meta=#{@meta.inspect}, status=#{@status.inspect}"
|
69
71
|
end
|
70
72
|
end
|
73
|
+
# rubocop:enable Style/GlobalVars
|
71
74
|
|
72
75
|
value = signal
|
73
76
|
|
74
77
|
@status = :running
|
75
|
-
|
78
|
+
raise value if value.is_a?(Celluloid::Interruption)
|
76
79
|
value
|
77
80
|
end
|
78
81
|
|
@@ -82,7 +85,9 @@ module Celluloid
|
|
82
85
|
if running?
|
83
86
|
deliver(value)
|
84
87
|
else
|
88
|
+
# rubocop:disable Metrics/LineLength
|
85
89
|
Internals::Logger.warn "Attempted to resume a dead task: type=#{@type.inspect}, meta=#{@meta.inspect}, status=#{@status.inspect}"
|
90
|
+
# rubocop:enable Metrics/LineLength
|
86
91
|
end
|
87
92
|
nil
|
88
93
|
end
|
@@ -103,20 +108,24 @@ module Celluloid
|
|
103
108
|
|
104
109
|
# Terminate this task
|
105
110
|
def terminate
|
106
|
-
|
111
|
+
raise "Cannot terminate an exclusive task" if exclusive?
|
107
112
|
|
108
113
|
if running?
|
114
|
+
# !!! DO NOT INTRODUCE ADDITIONAL GLOBAL VARIABLES !!!
|
115
|
+
# rubocop:disable Style/GlobalVars
|
109
116
|
if $CELLULOID_DEBUG
|
110
117
|
Internals::Logger.with_backtrace(backtrace) do |logger|
|
111
118
|
type = @dangerous_suspend ? :warn : :debug
|
112
119
|
logger.send(type, "Terminating task: type=#{@type.inspect}, meta=#{@meta.inspect}, status=#{@status.inspect}")
|
113
120
|
end
|
114
121
|
end
|
122
|
+
# rubocop:enable Style/GlobalVars
|
123
|
+
|
115
124
|
exception = TaskTerminated.new("task was terminated")
|
116
125
|
exception.set_backtrace(caller)
|
117
126
|
resume exception
|
118
127
|
else
|
119
|
-
|
128
|
+
raise DeadTaskError, "task is already dead"
|
120
129
|
end
|
121
130
|
end
|
122
131
|
|
@@ -125,8 +134,7 @@ module Celluloid
|
|
125
134
|
@exclusive
|
126
135
|
end
|
127
136
|
|
128
|
-
def backtrace
|
129
|
-
end
|
137
|
+
def backtrace; end
|
130
138
|
|
131
139
|
# Is the current task still running?
|
132
140
|
def running?
|
@@ -139,11 +147,14 @@ module Celluloid
|
|
139
147
|
end
|
140
148
|
|
141
149
|
def guard(message)
|
150
|
+
# !!! DO NOT INTRODUCE ADDITIONAL GLOBAL VARIABLES !!!
|
151
|
+
# rubocop:disable Style/GlobalVars
|
142
152
|
if @guard_warnings
|
143
153
|
Internals::Logger.warn message if $CELLULOID_DEBUG
|
144
154
|
else
|
145
|
-
|
155
|
+
raise message if $CELLULOID_DEBUG
|
146
156
|
end
|
157
|
+
# rubocop:enable Style/GlobalVars
|
147
158
|
end
|
148
159
|
|
149
160
|
private
|
@@ -161,7 +172,9 @@ module Celluloid
|
|
161
172
|
|
162
173
|
def thread_metadata
|
163
174
|
method = @meta && @meta[:method_name] || "<no method>"
|
164
|
-
klass = Thread.current[:celluloid_actor] &&
|
175
|
+
klass = Thread.current[:celluloid_actor] &&
|
176
|
+
Thread.current[:celluloid_actor].behavior.subject.bare_object.class ||
|
177
|
+
"<no actor>"
|
165
178
|
format("[Celluloid] %s#%s", klass, method)
|
166
179
|
end
|
167
180
|
end
|
data/lib/celluloid/test.rb
CHANGED
data/lib/celluloid/thread.rb
CHANGED
data/lib/celluloid/version.rb
CHANGED
data/lib/celluloid.rb
CHANGED
@@ -1,17 +1,17 @@
|
|
1
|
+
# TODO: eliminate use of global variables
|
2
|
+
require "English"
|
3
|
+
|
1
4
|
require "logger"
|
2
|
-
require "thread"
|
3
|
-
require "timeout"
|
4
5
|
require "set"
|
6
|
+
require "timeout"
|
5
7
|
|
8
|
+
# !!! DO NOT INTRODUCE ADDITIONAL GLOBAL VARIABLES !!!
|
9
|
+
# rubocop:disable Style/GlobalVars
|
6
10
|
$CELLULOID_DEBUG = false
|
7
|
-
$
|
11
|
+
$CELLULOID_MONITORING = false
|
12
|
+
# rubocop:enable Style/GlobalVars
|
8
13
|
|
9
14
|
require "celluloid/version"
|
10
|
-
require "celluloid/notices"
|
11
|
-
|
12
|
-
$CELLULOID_BACKPORTED = false if defined?(CELLULOID_FUTURE) && CELLULOID_FUTURE
|
13
|
-
$CELLULOID_BACKPORTED = (ENV["CELLULOID_BACKPORTED"] != "false") unless defined?($CELLULOID_BACKPORTED)
|
14
|
-
Celluloid::Notices.backported if $CELLULOID_BACKPORTED
|
15
15
|
|
16
16
|
module Celluloid
|
17
17
|
# Expose all instance methods as singleton methods
|
@@ -21,7 +21,7 @@ module Celluloid
|
|
21
21
|
LINKING_TIMEOUT = 5
|
22
22
|
|
23
23
|
# Warning message added to Celluloid objects accessed outside their actors
|
24
|
-
BARE_OBJECT_WARNING_MESSAGE = "WARNING: BARE CELLULOID OBJECT "
|
24
|
+
BARE_OBJECT_WARNING_MESSAGE = "WARNING: BARE CELLULOID OBJECT ".freeze
|
25
25
|
|
26
26
|
class << self
|
27
27
|
attr_writer :actor_system # Default Actor System
|
@@ -33,9 +33,11 @@ module Celluloid
|
|
33
33
|
|
34
34
|
def actor_system
|
35
35
|
if Thread.current.celluloid?
|
36
|
-
Thread.current[:celluloid_actor_system] ||
|
36
|
+
Thread.current[:celluloid_actor_system] || raise(Error, "actor system not running")
|
37
37
|
else
|
38
|
-
Thread.current[:celluloid_actor_system] ||
|
38
|
+
Thread.current[:celluloid_actor_system] ||
|
39
|
+
@actor_system ||
|
40
|
+
raise(Error, "Celluloid is not yet started; use Celluloid.boot")
|
39
41
|
end
|
40
42
|
end
|
41
43
|
|
@@ -54,15 +56,23 @@ module Celluloid
|
|
54
56
|
klass.property :exclusive_actor, default: false
|
55
57
|
klass.property :exclusive_methods, multi: true
|
56
58
|
klass.property :execute_block_on_receiver,
|
57
|
-
default: [
|
59
|
+
default: %i[after every receive],
|
58
60
|
multi: true
|
59
61
|
|
60
62
|
klass.property :finalizer
|
61
63
|
klass.property :exit_handler_name
|
62
64
|
|
63
65
|
singleton = class << klass; self; end
|
64
|
-
|
65
|
-
|
66
|
+
begin
|
67
|
+
singleton.send(:remove_method, :trap_exit)
|
68
|
+
rescue
|
69
|
+
nil
|
70
|
+
end
|
71
|
+
begin
|
72
|
+
singleton.send(:remove_method, :exclusive)
|
73
|
+
rescue
|
74
|
+
nil
|
75
|
+
end
|
66
76
|
|
67
77
|
singleton.send(:define_method, :trap_exit) do |*args|
|
68
78
|
exit_handler_name(*args)
|
@@ -96,20 +106,20 @@ module Celluloid
|
|
96
106
|
def cores
|
97
107
|
Internals::CPUCounter.cores
|
98
108
|
end
|
99
|
-
|
100
|
-
|
109
|
+
alias cpus cores
|
110
|
+
alias ncpus cores
|
101
111
|
|
102
112
|
# Perform a stack dump of all actors to the given output object
|
103
113
|
def stack_dump(output = STDERR)
|
104
114
|
actor_system.stack_dump.print(output)
|
105
115
|
end
|
106
|
-
|
116
|
+
alias dump stack_dump
|
107
117
|
|
108
118
|
# Perform a stack summary of all actors to the given output object
|
109
119
|
def stack_summary(output = STDERR)
|
110
120
|
actor_system.stack_summary.print(output)
|
111
121
|
end
|
112
|
-
|
122
|
+
alias summarize stack_summary
|
113
123
|
|
114
124
|
def public_registry
|
115
125
|
actor_system.public_registry
|
@@ -148,7 +158,7 @@ module Celluloid
|
|
148
158
|
end
|
149
159
|
|
150
160
|
def init
|
151
|
-
@actor_system
|
161
|
+
@actor_system ||= Actor::System.new
|
152
162
|
end
|
153
163
|
|
154
164
|
def start
|
@@ -157,24 +167,16 @@ module Celluloid
|
|
157
167
|
|
158
168
|
def running?
|
159
169
|
actor_system && actor_system.running?
|
170
|
+
rescue Error
|
171
|
+
false
|
160
172
|
end
|
161
173
|
|
174
|
+
# de TODO Anticipate outside process finalizer that would by-pass this.
|
162
175
|
def register_shutdown
|
163
176
|
return if defined?(@shutdown_registered) && @shutdown_registered
|
164
|
-
|
165
|
-
# Terminate all actors at exit
|
177
|
+
# Terminate all actors at exit, unless the exit is abnormal.
|
166
178
|
at_exit do
|
167
|
-
|
168
|
-
# allows "reason" in exit_handler to resolve before being destroyed
|
169
|
-
if defined?(RUBY_ENGINE) && RUBY_ENGINE == "ruby" && RUBY_VERSION >= "1.9"
|
170
|
-
# workaround for MRI bug losing exit status in at_exit block
|
171
|
-
# http://bugs.ruby-lang.org/issues/5218
|
172
|
-
exit_status = $ERROR_INFO.status if $ERROR_INFO.is_a?(SystemExit)
|
173
|
-
Celluloid.shutdown
|
174
|
-
exit exit_status if exit_status
|
175
|
-
else
|
176
|
-
Celluloid.shutdown
|
177
|
-
end
|
179
|
+
Celluloid.shutdown unless $ERROR_INFO
|
178
180
|
end
|
179
181
|
@shutdown_registered = true
|
180
182
|
end
|
@@ -182,6 +184,7 @@ module Celluloid
|
|
182
184
|
# Shut down all running actors
|
183
185
|
def shutdown
|
184
186
|
actor_system.shutdown
|
187
|
+
@actor_system = nil
|
185
188
|
end
|
186
189
|
|
187
190
|
def version
|
@@ -196,18 +199,18 @@ module Celluloid
|
|
196
199
|
proxy._send_(:initialize, *args, &block)
|
197
200
|
proxy
|
198
201
|
end
|
199
|
-
|
202
|
+
alias spawn new
|
200
203
|
|
201
204
|
# Create a new actor and link to the current one
|
202
205
|
def new_link(*args, &block)
|
203
|
-
|
206
|
+
raise NotActorError, "can't link outside actor context" unless Celluloid.actor?
|
204
207
|
|
205
208
|
proxy = Cell.new(allocate, behavior_options, actor_options).proxy
|
206
209
|
Actor.link(proxy)
|
207
210
|
proxy._send_(:initialize, *args, &block)
|
208
211
|
proxy
|
209
212
|
end
|
210
|
-
|
213
|
+
alias spawn_link new_link
|
211
214
|
|
212
215
|
# Run an actor in the foreground
|
213
216
|
def run(*args, &block)
|
@@ -225,7 +228,7 @@ module Celluloid
|
|
225
228
|
mailbox_class: mailbox_class,
|
226
229
|
mailbox_size: mailbox_size,
|
227
230
|
task_class: task_class,
|
228
|
-
exclusive: exclusive_actor
|
231
|
+
exclusive: exclusive_actor
|
229
232
|
}
|
230
233
|
end
|
231
234
|
|
@@ -235,7 +238,7 @@ module Celluloid
|
|
235
238
|
exclusive_methods: exclusive_methods,
|
236
239
|
exit_handler_name: exit_handler_name,
|
237
240
|
finalizer: finalizer,
|
238
|
-
receiver_block_executions: execute_block_on_receiver
|
241
|
+
receiver_block_executions: execute_block_on_receiver
|
239
242
|
}
|
240
243
|
end
|
241
244
|
|
@@ -263,7 +266,7 @@ module Celluloid
|
|
263
266
|
def bare_object
|
264
267
|
self
|
265
268
|
end
|
266
|
-
|
269
|
+
alias wrapped_object bare_object
|
267
270
|
|
268
271
|
# Are we being invoked in a different thread from our owner?
|
269
272
|
def leaked?
|
@@ -279,18 +282,18 @@ module Celluloid
|
|
279
282
|
def registered_name
|
280
283
|
Actor.registered_name
|
281
284
|
end
|
282
|
-
|
285
|
+
alias name registered_name
|
283
286
|
|
284
287
|
def inspect
|
285
288
|
return "..." if Celluloid.detect_recursion
|
286
289
|
|
287
290
|
str = "#<"
|
288
291
|
|
289
|
-
if leaked?
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
|
292
|
+
str << if leaked?
|
293
|
+
Celluloid::BARE_OBJECT_WARNING_MESSAGE
|
294
|
+
else
|
295
|
+
"Celluloid::Proxy::Cell"
|
296
|
+
end
|
294
297
|
|
295
298
|
str << "(#{self.class}:0x#{object_id.to_s(16)})"
|
296
299
|
str << " " unless instance_variables.empty?
|
@@ -318,9 +321,10 @@ module Celluloid
|
|
318
321
|
cause = case cause
|
319
322
|
when String then RuntimeError.new(cause)
|
320
323
|
when Exception then cause
|
321
|
-
else
|
322
|
-
|
323
|
-
|
324
|
+
else raise TypeError, "Exception object/String expected, but #{cause.class} received"
|
325
|
+
end
|
326
|
+
|
327
|
+
raise AbortError, cause
|
324
328
|
end
|
325
329
|
|
326
330
|
# Terminate this actor
|
@@ -457,14 +461,13 @@ module Celluloid
|
|
457
461
|
end
|
458
462
|
end
|
459
463
|
|
460
|
-
if defined?(JRUBY_VERSION) && JRUBY_VERSION == "1.7.3"
|
461
|
-
fail "Celluloid is broken on JRuby 1.7.3. Please upgrade to 1.7.4+"
|
462
|
-
end
|
463
|
-
|
464
464
|
require "celluloid/exceptions"
|
465
465
|
|
466
466
|
Celluloid.logger = Logger.new(STDERR).tap do |logger|
|
467
|
+
# !!! DO NOT INTRODUCE ADDITIONAL GLOBAL VARIABLES !!!
|
468
|
+
# rubocop:disable Style/GlobalVars
|
467
469
|
logger.level = Logger::INFO unless $CELLULOID_DEBUG
|
470
|
+
# rubocop:enable Style/GlobalVars
|
468
471
|
end
|
469
472
|
|
470
473
|
Celluloid.shutdown_timeout = 10
|
@@ -483,8 +486,6 @@ require "celluloid/proxies"
|
|
483
486
|
require "celluloid/mailbox"
|
484
487
|
require "celluloid/mailbox/evented"
|
485
488
|
|
486
|
-
require "celluloid/essentials"
|
487
|
-
|
488
489
|
require "celluloid/group"
|
489
490
|
require "celluloid/group/spawner"
|
490
491
|
require "celluloid/group/pool" # TODO: Find way to only load this if being used.
|
@@ -497,13 +498,27 @@ require "celluloid/actor"
|
|
497
498
|
require "celluloid/cell"
|
498
499
|
require "celluloid/future"
|
499
500
|
|
501
|
+
require "celluloid/internals/call_chain"
|
502
|
+
require "celluloid/internals/cpu_counter"
|
503
|
+
require "celluloid/internals/handlers"
|
504
|
+
require "celluloid/internals/links"
|
505
|
+
require "celluloid/internals/logger"
|
506
|
+
require "celluloid/internals/method"
|
507
|
+
require "celluloid/internals/properties"
|
508
|
+
require "celluloid/internals/receivers"
|
509
|
+
require "celluloid/internals/registry"
|
510
|
+
require "celluloid/internals/responses"
|
511
|
+
require "celluloid/internals/signals"
|
512
|
+
require "celluloid/internals/stack"
|
513
|
+
require "celluloid/internals/task_set"
|
514
|
+
require "celluloid/internals/thread_handle"
|
515
|
+
require "celluloid/internals/uuid"
|
516
|
+
|
517
|
+
require "celluloid/notifications"
|
518
|
+
require "celluloid/supervision"
|
519
|
+
|
520
|
+
require "celluloid/logging"
|
500
521
|
require "celluloid/actor/system"
|
501
|
-
require "celluloid/actor/manager"
|
502
|
-
|
503
|
-
require "celluloid/deprecate" unless $CELLULOID_BACKPORTED == false
|
504
|
-
|
505
|
-
$CELLULOID_MONITORING = false
|
506
|
-
Celluloid::Notices.output
|
507
522
|
|
508
523
|
# Configure default systemwide settings
|
509
524
|
|
@@ -530,8 +545,3 @@ Celluloid.group_class =
|
|
530
545
|
Celluloid::Group.const_get(str)
|
531
546
|
end
|
532
547
|
end
|
533
|
-
|
534
|
-
unless defined?($CELLULOID_TEST) && $CELLULOID_TEST
|
535
|
-
Celluloid.register_shutdown
|
536
|
-
Celluloid.init
|
537
|
-
end
|