celluloid 0.18.0.pre → 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 +5 -5
- data/CHANGES.md +258 -39
- data/CONDUCT.md +13 -0
- data/CONTRIBUTING.md +39 -0
- data/README.md +54 -165
- 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.rb +72 -47
- data/lib/celluloid/actor.rb +27 -17
- data/lib/celluloid/actor/system.rb +13 -29
- data/lib/celluloid/autostart.rb +5 -5
- data/lib/celluloid/call/async.rb +2 -0
- data/lib/celluloid/call/sync.rb +10 -3
- data/lib/celluloid/calls.rb +5 -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 +7 -9
- data/lib/celluloid/group.rb +12 -8
- data/lib/celluloid/group/pool.rb +1 -3
- data/lib/celluloid/group/spawner.rb +2 -6
- 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.rb +74 -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/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.rb +22 -9
- data/lib/celluloid/mailbox/evented.rb +13 -5
- 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.rb +17 -0
- data/lib/celluloid/supervision/configuration.rb +169 -0
- data/lib/celluloid/supervision/configuration/injections.rb +8 -0
- data/lib/celluloid/supervision/configuration/instance.rb +113 -0
- data/lib/celluloid/supervision/constants.rb +123 -0
- data/lib/celluloid/supervision/container.rb +144 -0
- data/lib/celluloid/supervision/container/behavior.rb +89 -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/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/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/system_events.rb +11 -6
- data/lib/celluloid/task.rb +25 -12
- data/lib/celluloid/task/fibered.rb +2 -0
- data/lib/celluloid/task/threaded.rb +3 -3
- data/lib/celluloid/test.rb +5 -2
- data/lib/celluloid/thread.rb +0 -2
- data/lib/celluloid/version.rb +1 -1
- data/spec/celluloid/block_spec.rb +29 -32
- data/spec/celluloid/calls_spec.rb +5 -15
- data/spec/celluloid/future_spec.rb +2 -2
- 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 +2 -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 -323
- data/culture/CONDUCT.md +0 -38
- data/culture/GSoC/1010-why_we_will_participate.md +0 -17
- data/culture/GSoC/1020-how_mentors_stay_engaged.md +0 -7
- data/culture/GSoC/1030-keeping_students_on_schedule.md +0 -9
- data/culture/GSoC/1040-getting_students_involved.md +0 -5
- data/culture/GSoC/1050-student_involvement_after.md +0 -5
- data/culture/GSoC/README.md +0 -16
- 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 -93
- 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 -61
- 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 -34
- 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
data/examples/futures.rb
CHANGED
data/examples/ring.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
-
$LOAD_PATH.push File.expand_path("
|
3
|
+
$LOAD_PATH.push File.expand_path("../lib", __dir__)
|
4
4
|
require "celluloid/autostart"
|
5
5
|
|
6
6
|
class Ring
|
@@ -28,7 +28,7 @@ class Ring
|
|
28
28
|
|
29
29
|
# Go around the ring the given number of times
|
30
30
|
def run(n)
|
31
|
-
|
31
|
+
raise ArgumentError, "I can't go around a negative number of times" if n < 0
|
32
32
|
|
33
33
|
async.around n
|
34
34
|
wait :done
|
@@ -48,14 +48,15 @@ if $PROGRAM_NAME == __FILE__
|
|
48
48
|
require "benchmark"
|
49
49
|
SIZE = 512
|
50
50
|
TIMES = 10
|
51
|
+
ring = nil
|
51
52
|
|
52
53
|
puts "*** Creating a #{SIZE} node ring..."
|
53
54
|
puts Benchmark.measure {
|
54
|
-
|
55
|
+
ring = Ring.new(SIZE)
|
55
56
|
}
|
56
57
|
|
57
58
|
puts "*** Sending a message around #{TIMES} times"
|
58
59
|
puts Benchmark.measure {
|
59
|
-
|
60
|
+
ring.run(TIMES)
|
60
61
|
}
|
61
62
|
end
|
data/examples/simple_pmap.rb
CHANGED
data/examples/stack.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
-
$LOAD_PATH.push File.expand_path("
|
3
|
+
$LOAD_PATH.push File.expand_path("../lib", __dir__)
|
4
4
|
require "celluloid/autostart"
|
5
5
|
|
6
6
|
# This example builds on basic_usage.rb to show two things about #async: the
|
@@ -17,7 +17,7 @@ class Stack
|
|
17
17
|
def push(x)
|
18
18
|
@ary.push x
|
19
19
|
end
|
20
|
-
|
20
|
+
alias << push
|
21
21
|
|
22
22
|
def pop
|
23
23
|
@ary.pop
|
@@ -0,0 +1,82 @@
|
|
1
|
+
require "celluloid/autostart"
|
2
|
+
|
3
|
+
class MyActor
|
4
|
+
include Celluloid
|
5
|
+
attr_reader :state
|
6
|
+
|
7
|
+
def initialize
|
8
|
+
@state = :clean
|
9
|
+
end
|
10
|
+
|
11
|
+
def broken_method
|
12
|
+
@state = :dirty
|
13
|
+
oh_crap_im_totally_broken
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
#
|
18
|
+
# Using the Supervisor API directly
|
19
|
+
#
|
20
|
+
|
21
|
+
puts "*** Demonstrating using the Supervisor API directly"
|
22
|
+
|
23
|
+
# Calling supervise directly returns the supervisor
|
24
|
+
supervisor = MyActor.supervise
|
25
|
+
|
26
|
+
# We can get to the current version of an actor by calling
|
27
|
+
# Celluloid::Supervisor#actors. This prints ':clean'
|
28
|
+
puts "We should be in a clean state now: #{supervisor.actors.first.state}"
|
29
|
+
puts "Brace yourself for a crash message..."
|
30
|
+
|
31
|
+
# If we call a method that crashes an actor, it will print out a debug message,
|
32
|
+
# then restart an actor in a clean state
|
33
|
+
begin
|
34
|
+
supervisor.actors.first.broken_method
|
35
|
+
rescue NameError
|
36
|
+
puts "Uhoh, we crashed the actor..."
|
37
|
+
end
|
38
|
+
|
39
|
+
puts "The supervisor should automatically restart the actor"
|
40
|
+
|
41
|
+
# By now we'll be back in a :clean state!
|
42
|
+
begin
|
43
|
+
puts "We should now be in a clean state again: #{supervisor.actors.first.state}"
|
44
|
+
rescue Celluloid::DeadActorError
|
45
|
+
# Perhaps we got ahold of the actor before the supervisor restarted it
|
46
|
+
retry
|
47
|
+
end
|
48
|
+
|
49
|
+
#
|
50
|
+
# Using the Actor Registry
|
51
|
+
# This is the preferred approach and will make using DCell easier
|
52
|
+
#
|
53
|
+
|
54
|
+
puts "*** Demonstrating using the actor registry"
|
55
|
+
|
56
|
+
# We can give our actor a name and thus avoid interacting with the supervisor
|
57
|
+
MyActor.supervise as: :my_actor
|
58
|
+
|
59
|
+
# Same as above, just getting the actor from a different place
|
60
|
+
puts "We should be in a clean state now: #{Celluloid::Actor[:my_actor].state}"
|
61
|
+
puts "Brace yourself for a crash message..."
|
62
|
+
|
63
|
+
# If we call a method that crashes an actor, it will print out a debug message,
|
64
|
+
# then restart an actor in a clean state
|
65
|
+
begin
|
66
|
+
Celluloid::Actor[:my_actor].broken_method
|
67
|
+
rescue NameError
|
68
|
+
puts "Uhoh, we crashed the actor..."
|
69
|
+
end
|
70
|
+
|
71
|
+
puts "The supervisor should automatically restart the actor"
|
72
|
+
|
73
|
+
# By now we'll be back in a :clean state!
|
74
|
+
begin
|
75
|
+
puts "We should now be in a clean state again: #{Celluloid::Actor[:my_actor].state}"
|
76
|
+
rescue Celluloid::DeadActorError
|
77
|
+
# Perhaps we got ahold of the actor before the supervisor restarted it
|
78
|
+
# Don't want to catch Celluloid::DeadActorError all over the place? If this
|
79
|
+
# code were in a supervised Celluloid::Actor itself, the supervisor would
|
80
|
+
# catch Celluloid::DeadActorError and automatically restart this actor
|
81
|
+
retry
|
82
|
+
end
|
data/examples/timers.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
|
@@ -157,14 +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
|
|
162
|
-
#de TODO Anticipate outside process finalizer that would by-pass this.
|
174
|
+
# de TODO Anticipate outside process finalizer that would by-pass this.
|
163
175
|
def register_shutdown
|
164
176
|
return if defined?(@shutdown_registered) && @shutdown_registered
|
165
177
|
# Terminate all actors at exit, unless the exit is abnormal.
|
166
178
|
at_exit do
|
167
|
-
Celluloid.shutdown unless
|
179
|
+
Celluloid.shutdown unless $ERROR_INFO
|
168
180
|
end
|
169
181
|
@shutdown_registered = true
|
170
182
|
end
|
@@ -172,6 +184,7 @@ module Celluloid
|
|
172
184
|
# Shut down all running actors
|
173
185
|
def shutdown
|
174
186
|
actor_system.shutdown
|
187
|
+
@actor_system = nil
|
175
188
|
end
|
176
189
|
|
177
190
|
def version
|
@@ -186,18 +199,18 @@ module Celluloid
|
|
186
199
|
proxy._send_(:initialize, *args, &block)
|
187
200
|
proxy
|
188
201
|
end
|
189
|
-
|
202
|
+
alias spawn new
|
190
203
|
|
191
204
|
# Create a new actor and link to the current one
|
192
205
|
def new_link(*args, &block)
|
193
|
-
|
206
|
+
raise NotActorError, "can't link outside actor context" unless Celluloid.actor?
|
194
207
|
|
195
208
|
proxy = Cell.new(allocate, behavior_options, actor_options).proxy
|
196
209
|
Actor.link(proxy)
|
197
210
|
proxy._send_(:initialize, *args, &block)
|
198
211
|
proxy
|
199
212
|
end
|
200
|
-
|
213
|
+
alias spawn_link new_link
|
201
214
|
|
202
215
|
# Run an actor in the foreground
|
203
216
|
def run(*args, &block)
|
@@ -215,7 +228,7 @@ module Celluloid
|
|
215
228
|
mailbox_class: mailbox_class,
|
216
229
|
mailbox_size: mailbox_size,
|
217
230
|
task_class: task_class,
|
218
|
-
exclusive: exclusive_actor
|
231
|
+
exclusive: exclusive_actor
|
219
232
|
}
|
220
233
|
end
|
221
234
|
|
@@ -225,7 +238,7 @@ module Celluloid
|
|
225
238
|
exclusive_methods: exclusive_methods,
|
226
239
|
exit_handler_name: exit_handler_name,
|
227
240
|
finalizer: finalizer,
|
228
|
-
receiver_block_executions: execute_block_on_receiver
|
241
|
+
receiver_block_executions: execute_block_on_receiver
|
229
242
|
}
|
230
243
|
end
|
231
244
|
|
@@ -253,7 +266,7 @@ module Celluloid
|
|
253
266
|
def bare_object
|
254
267
|
self
|
255
268
|
end
|
256
|
-
|
269
|
+
alias wrapped_object bare_object
|
257
270
|
|
258
271
|
# Are we being invoked in a different thread from our owner?
|
259
272
|
def leaked?
|
@@ -269,18 +282,18 @@ module Celluloid
|
|
269
282
|
def registered_name
|
270
283
|
Actor.registered_name
|
271
284
|
end
|
272
|
-
|
285
|
+
alias name registered_name
|
273
286
|
|
274
287
|
def inspect
|
275
288
|
return "..." if Celluloid.detect_recursion
|
276
289
|
|
277
290
|
str = "#<"
|
278
291
|
|
279
|
-
if leaked?
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
292
|
+
str << if leaked?
|
293
|
+
Celluloid::BARE_OBJECT_WARNING_MESSAGE
|
294
|
+
else
|
295
|
+
"Celluloid::Proxy::Cell"
|
296
|
+
end
|
284
297
|
|
285
298
|
str << "(#{self.class}:0x#{object_id.to_s(16)})"
|
286
299
|
str << " " unless instance_variables.empty?
|
@@ -308,9 +321,10 @@ module Celluloid
|
|
308
321
|
cause = case cause
|
309
322
|
when String then RuntimeError.new(cause)
|
310
323
|
when Exception then cause
|
311
|
-
else
|
312
|
-
|
313
|
-
|
324
|
+
else raise TypeError, "Exception object/String expected, but #{cause.class} received"
|
325
|
+
end
|
326
|
+
|
327
|
+
raise AbortError, cause
|
314
328
|
end
|
315
329
|
|
316
330
|
# Terminate this actor
|
@@ -447,14 +461,13 @@ module Celluloid
|
|
447
461
|
end
|
448
462
|
end
|
449
463
|
|
450
|
-
if defined?(JRUBY_VERSION) && JRUBY_VERSION == "1.7.3"
|
451
|
-
fail "Celluloid is broken on JRuby 1.7.3. Please upgrade to 1.7.4+"
|
452
|
-
end
|
453
|
-
|
454
464
|
require "celluloid/exceptions"
|
455
465
|
|
456
466
|
Celluloid.logger = Logger.new(STDERR).tap do |logger|
|
467
|
+
# !!! DO NOT INTRODUCE ADDITIONAL GLOBAL VARIABLES !!!
|
468
|
+
# rubocop:disable Style/GlobalVars
|
457
469
|
logger.level = Logger::INFO unless $CELLULOID_DEBUG
|
470
|
+
# rubocop:enable Style/GlobalVars
|
458
471
|
end
|
459
472
|
|
460
473
|
Celluloid.shutdown_timeout = 10
|
@@ -473,8 +486,6 @@ require "celluloid/proxies"
|
|
473
486
|
require "celluloid/mailbox"
|
474
487
|
require "celluloid/mailbox/evented"
|
475
488
|
|
476
|
-
require "celluloid/essentials"
|
477
|
-
|
478
489
|
require "celluloid/group"
|
479
490
|
require "celluloid/group/spawner"
|
480
491
|
require "celluloid/group/pool" # TODO: Find way to only load this if being used.
|
@@ -487,13 +498,27 @@ require "celluloid/actor"
|
|
487
498
|
require "celluloid/cell"
|
488
499
|
require "celluloid/future"
|
489
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"
|
490
521
|
require "celluloid/actor/system"
|
491
|
-
require "celluloid/actor/manager"
|
492
|
-
|
493
|
-
require "celluloid/deprecate" unless $CELLULOID_BACKPORTED == false
|
494
|
-
|
495
|
-
$CELLULOID_MONITORING = false
|
496
|
-
Celluloid::Notices.output
|
497
522
|
|
498
523
|
# Configure default systemwide settings
|
499
524
|
|
data/lib/celluloid/actor.rb
CHANGED
@@ -16,14 +16,14 @@ module Celluloid
|
|
16
16
|
# Obtain the current actor
|
17
17
|
def current
|
18
18
|
actor = Thread.current[:celluloid_actor]
|
19
|
-
|
19
|
+
raise NotActorError, "not in actor scope" unless actor
|
20
20
|
actor.behavior_proxy
|
21
21
|
end
|
22
22
|
|
23
23
|
# Obtain the name of the current actor
|
24
24
|
def registered_name
|
25
25
|
actor = Thread.current[:celluloid_actor]
|
26
|
-
|
26
|
+
raise NotActorError, "not in actor scope" unless actor
|
27
27
|
actor.name
|
28
28
|
end
|
29
29
|
|
@@ -52,13 +52,13 @@ module Celluloid
|
|
52
52
|
|
53
53
|
# Watch for exit events from another actor
|
54
54
|
def monitor(actor)
|
55
|
-
|
55
|
+
raise NotActorError, "can't link outside actor context" unless Celluloid.actor?
|
56
56
|
Thread.current[:celluloid_actor].linking_request(actor, :link)
|
57
57
|
end
|
58
58
|
|
59
59
|
# Stop waiting for exit events from another actor
|
60
60
|
def unmonitor(actor)
|
61
|
-
|
61
|
+
raise NotActorError, "can't link outside actor context" unless Celluloid.actor?
|
62
62
|
Thread.current[:celluloid_actor].linking_request(actor, :unlink)
|
63
63
|
end
|
64
64
|
|
@@ -132,8 +132,11 @@ module Celluloid
|
|
132
132
|
end
|
133
133
|
|
134
134
|
@proxy = Proxy::Actor.new(@mailbox, @thread)
|
135
|
+
|
136
|
+
# !!! DO NOT INTRODUCE ADDITIONAL GLOBAL VARIABLES !!!
|
137
|
+
# rubocop:disable Style/GlobalVars
|
135
138
|
Celluloid::Probe.actor_created(self) if $CELLULOID_MONITORING
|
136
|
-
|
139
|
+
# rubocop:enable Style/GlobalVars
|
137
140
|
end
|
138
141
|
|
139
142
|
def behavior_proxy
|
@@ -187,25 +190,28 @@ module Celluloid
|
|
187
190
|
begin
|
188
191
|
message = @mailbox.receive(remaining) do |msg|
|
189
192
|
msg.is_a?(LinkingResponse) &&
|
190
|
-
|
191
|
-
|
193
|
+
msg.actor.mailbox.address == receiver.mailbox.address &&
|
194
|
+
msg.type == type
|
192
195
|
end
|
193
196
|
rescue TaskTimeout
|
194
197
|
next # IO reactor did something, no message in queue yet.
|
195
198
|
end
|
196
199
|
|
197
200
|
if message.instance_of? LinkingResponse
|
201
|
+
# !!! DO NOT INTRODUCE ADDITIONAL GLOBAL VARIABLES !!!
|
202
|
+
# rubocop:disable Style/GlobalVars
|
198
203
|
Celluloid::Probe.actors_linked(self, receiver) if $CELLULOID_MONITORING
|
204
|
+
# rubocop:enable Style/GlobalVars
|
199
205
|
system_events.each { |ev| @mailbox << ev }
|
200
206
|
return
|
201
207
|
elsif message.is_a? SystemEvent
|
202
208
|
# Queue up pending system events to be processed after we've successfully linked
|
203
209
|
system_events << message
|
204
|
-
else
|
210
|
+
else raise "Unexpected message type: #{message.class}. Expected LinkingResponse, NilClass, SystemEvent."
|
205
211
|
end
|
206
212
|
end
|
207
213
|
|
208
|
-
|
214
|
+
raise TaskTimeout, "linking timeout of #{LINKING_TIMEOUT} seconds exceeded with receiver: #{receiver}"
|
209
215
|
end
|
210
216
|
end
|
211
217
|
|
@@ -218,7 +224,7 @@ module Celluloid
|
|
218
224
|
def wait(name)
|
219
225
|
@signals.wait name
|
220
226
|
end
|
221
|
-
|
227
|
+
|
222
228
|
# Register a new handler for a given pattern
|
223
229
|
def handle(*patterns, &block)
|
224
230
|
@handlers.handle(*patterns, &block)
|
@@ -226,7 +232,7 @@ module Celluloid
|
|
226
232
|
|
227
233
|
# Receive an asynchronous message
|
228
234
|
def receive(timeout = nil, &block)
|
229
|
-
|
235
|
+
loop do
|
230
236
|
message = @receivers.receive(timeout, &block)
|
231
237
|
return message unless message.is_a?(SystemEvent)
|
232
238
|
|
@@ -280,16 +286,16 @@ module Celluloid
|
|
280
286
|
|
281
287
|
# Handle standard low-priority messages
|
282
288
|
def handle_message(message)
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
289
|
+
# !!! DO NOT INTRODUCE ADDITIONAL GLOBAL VARIABLES !!!
|
290
|
+
# rubocop:disable Metrics/LineLength, Style/GlobalVars
|
291
|
+
Internals::Logger.debug "Discarded message (unhandled): #{message}" if !@handlers.handle_message(message) && !@receivers.handle_message(message) && $CELLULOID_DEBUG
|
292
|
+
# rubocop:enable Metrics/LineLength, Style/GlobalVars
|
293
|
+
|
288
294
|
message
|
289
295
|
end
|
290
296
|
|
291
297
|
def default_exit_handler(event)
|
292
|
-
|
298
|
+
raise event.reason if event.reason
|
293
299
|
end
|
294
300
|
|
295
301
|
# Handle any exceptions that occur within a running actor
|
@@ -312,7 +318,11 @@ module Celluloid
|
|
312
318
|
|
313
319
|
# Clean up after this actor
|
314
320
|
def cleanup(exit_event)
|
321
|
+
# !!! DO NOT INTRODUCE ADDITIONAL GLOBAL VARIABLES !!!
|
322
|
+
# rubocop:disable Style/GlobalVars
|
315
323
|
Celluloid::Probe.actor_died(self) if $CELLULOID_MONITORING
|
324
|
+
# rubocop:enable Style/GlobalVars
|
325
|
+
|
316
326
|
@mailbox.shutdown
|
317
327
|
@links.each do |actor|
|
318
328
|
actor.mailbox << exit_event if actor.mailbox.alive?
|