celluloid 0.13.0.pre → 0.13.0.pre2

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -1,8 +1,10 @@
1
1
  ![Celluloid](https://raw.github.com/celluloid/celluloid-logos/master/celluloid/celluloid.png)
2
2
  =========
3
+ [![Gem Version](https://badge.fury.io/rb/celluloid.png)](http://rubygems.org/gems/celluloid)
3
4
  [![Build Status](https://secure.travis-ci.org/celluloid/celluloid.png?branch=master)](http://travis-ci.org/celluloid/celluloid)
4
5
  [![Dependency Status](https://gemnasium.com/celluloid/celluloid.png)](https://gemnasium.com/celluloid/celluloid)
5
6
  [![Code Climate](https://codeclimate.com/github/celluloid/celluloid.png)](https://codeclimate.com/github/celluloid/celluloid)
7
+ [![Coverage Status](https://coveralls.io/repos/celluloid/celluloid/badge.png?branch=master)](https://coveralls.io/r/celluloid/celluloid)
6
8
 
7
9
  > "I thought of objects being like biological cells and/or individual
8
10
  > computers on a network, only able to communicate with messages"
@@ -71,6 +73,10 @@ library.
71
73
  Like Celluloid? [Join the Google Group](http://groups.google.com/group/celluloid-ruby)
72
74
  or visit us on IRC at #celluloid on freenode
73
75
 
76
+ ### Is it any good?
77
+
78
+ [Yes](http://news.ycombinator.com/item?id=3067434)
79
+
74
80
  ### Is It "Production Ready™"?
75
81
 
76
82
  Yes, many users are now running Celluloid in production by using
@@ -104,25 +110,20 @@ Or install it yourself as:
104
110
 
105
111
  $ gem install celluloid
106
112
 
107
- Inside of your Ruby program do:
108
-
109
- require 'celluloid'
113
+ Inside of your Ruby program, require Celluloid with:
110
114
 
111
- ...to pull it in as a dependency.
115
+ require 'celluloid/autostart'
112
116
 
113
117
  Supported Platforms
114
118
  -------------------
115
119
 
116
- Celluloid works on Ruby 1.9.3, JRuby 1.6, and Rubinius 2.0. JRuby or Rubinius
117
- are the preferred platforms as they support true thread-level parallelism when
118
- executing Ruby code, whereas MRI/YARV is constrained by a global interpreter
119
- lock (GIL) and can only execute one thread at a time.
120
+ Celluloid works on Ruby 1.9.3, 2.0.0, JRuby 1.6+, and Rubinius 2.0.
120
121
 
121
- Celluloid requires Ruby 1.9 mode on all interpreters. This works out of the
122
- box on MRI/YARV, and requires the following flags elsewhere:
122
+ JRuby or Rubinius are the preferred platforms as they support true thread-level
123
+ parallelism when executing Ruby code, whereas MRI/YARV is constrained by a global
124
+ interpreter lock (GIL) and can only execute one thread at a time.
123
125
 
124
- * JRuby: --1.9 command line option, or JRUBY_OPTS=--1.9 environment variable
125
- * rbx: -X19 command line option
126
+ Celluloid requires Ruby 1.9 mode on all interpreters.
126
127
 
127
128
  Additional Reading
128
129
  ------------------
@@ -134,9 +135,9 @@ Contributing to Celluloid
134
135
  -------------------------
135
136
 
136
137
  * Fork this repository on github
137
- * Make your changes and send me a pull request
138
- * If I like them I'll merge them
139
- * If I've accepted a patch, feel free to ask for commit access
138
+ * Make your changes and send us a pull request
139
+ * If we like them we'll merge them
140
+ * If we've accepted a patch, feel free to ask for commit access
140
141
 
141
142
  License
142
143
  -------
data/lib/celluloid.rb CHANGED
@@ -6,16 +6,14 @@ require 'set'
6
6
  module Celluloid
7
7
  extend self # expose all instance methods as singleton methods
8
8
 
9
- # How long actors have to terminate
10
- SHUTDOWN_TIMEOUT = 10
11
-
12
9
  # Warning message added to Celluloid objects accessed outside their actors
13
10
  BARE_OBJECT_WARNING_MESSAGE = "WARNING: BARE CELLULOID OBJECT "
14
11
 
15
12
  class << self
16
- attr_accessor :internal_pool # Internal thread pool
17
- attr_accessor :logger # Thread-safe logger class
18
- attr_accessor :task_class # Default task type to use
13
+ attr_accessor :internal_pool # Internal thread pool
14
+ attr_accessor :logger # Thread-safe logger class
15
+ attr_accessor :task_class # Default task type to use
16
+ attr_accessor :shutdown_timeout # How long actors have to terminate
19
17
 
20
18
  def included(klass)
21
19
  klass.send :extend, ClassMethods
@@ -50,9 +48,26 @@ module Celluloid
50
48
  Logger.exception_handler(&block)
51
49
  end
52
50
 
51
+ def suspend(status, waiter)
52
+ task = Thread.current[:celluloid_task]
53
+ if task && !Celluloid.exclusive?
54
+ waiter.before_suspend(task) if waiter.respond_to?(:before_suspend)
55
+ Task.suspend(status)
56
+ else
57
+ waiter.wait
58
+ end
59
+ end
60
+
61
+ # Launch default services
62
+ # FIXME: We should set up the supervision hierarchy here
63
+ def boot
64
+ Celluloid::Notifications::Fanout.supervise_as :notifications_fanout
65
+ Celluloid::IncidentReporter.supervise_as :default_incident_reporter, STDERR
66
+ end
67
+
53
68
  # Shut down all running actors
54
69
  def shutdown
55
- Timeout.timeout(SHUTDOWN_TIMEOUT) do
70
+ Timeout.timeout(shutdown_timeout) do
56
71
  actors = Actor.all
57
72
  Logger.debug "Terminating #{actors.size} actors..." if actors.size > 0
58
73
 
@@ -77,7 +92,7 @@ module Celluloid
77
92
  Logger.debug "Shutdown completed cleanly"
78
93
  end
79
94
  rescue Timeout::Error => ex
80
- Logger.error("Couldn't cleanly terminate all actors in #{SHUTDOWN_TIMEOUT} seconds!")
95
+ Logger.error("Couldn't cleanly terminate all actors in #{shutdown_timeout} seconds!")
81
96
  end
82
97
  end
83
98
 
@@ -204,6 +219,12 @@ module Celluloid
204
219
  end
205
220
  end
206
221
 
222
+ # Mark methods as running blocks on the receiver
223
+ def execute_block_on_receiver(*methods)
224
+ # A noop method in preparation
225
+ # See https://github.com/celluloid/celluloid/pull/55
226
+ end
227
+
207
228
  # Configuration options for Actor#new
208
229
  def actor_options
209
230
  {
@@ -457,4 +478,8 @@ require 'celluloid/notifications'
457
478
  require 'celluloid/logging'
458
479
 
459
480
  require 'celluloid/legacy' unless defined?(CELLULOID_FUTURE)
460
- require 'celluloid/boot'
481
+
482
+ # Configure default systemwide settings
483
+ Celluloid.task_class = Celluloid::TaskFiber
484
+ Celluloid.logger = Logger.new(STDERR)
485
+ Celluloid.shutdown_timeout = 10
@@ -66,19 +66,7 @@ module Celluloid
66
66
  raise DeadActorError, "attempted to call a dead actor"
67
67
  end
68
68
 
69
- if Thread.current[:celluloid_task] && !Celluloid.exclusive?
70
- Task.suspend(:callwait).value
71
- else
72
- response = loop do
73
- message = Thread.mailbox.receive do |msg|
74
- msg.respond_to?(:call) and msg.call == call
75
- end
76
- break message unless message.is_a?(SystemEvent)
77
- Thread.current[:celluloid_actor].handle_system_event(message)
78
- end
79
-
80
- response.value
81
- end
69
+ Celluloid.suspend(:callwait, call).value
82
70
  end
83
71
 
84
72
  # Invoke a method asynchronously on an actor via its mailbox
@@ -168,7 +156,7 @@ module Celluloid
168
156
  @exclusives = options[:exclusive_methods]
169
157
  @task_class = options[:task_class] || Celluloid.task_class
170
158
 
171
- @tasks = Set.new
159
+ @tasks = TaskSet.new
172
160
  @links = Links.new
173
161
  @signals = Signals.new
174
162
  @receivers = Receivers.new
@@ -308,15 +296,25 @@ module Celluloid
308
296
  @timers.every(interval) { task(:timer, &block) }
309
297
  end
310
298
 
299
+ class Sleeper
300
+ def initialize(timers, interval)
301
+ @timers = timers
302
+ @interval = interval
303
+ end
304
+
305
+ def before_suspend(task)
306
+ @timers.after(@interval) { task.resume }
307
+ end
308
+
309
+ def wait
310
+ Kernel.sleep(@interval)
311
+ end
312
+ end
313
+
311
314
  # Sleep for the given amount of time
312
315
  def sleep(interval)
313
- task = Thread.current[:celluloid_task]
314
- if task && !Celluloid.exclusive?
315
- @timers.after(interval) { task.resume }
316
- Task.suspend :sleeping
317
- else
318
- Kernel.sleep(interval)
319
- end
316
+ sleeper = Sleeper.new(@timers, interval)
317
+ Celluloid.suspend(:sleeping, sleeper)
320
318
  end
321
319
 
322
320
  # Handle standard low-priority messages
@@ -390,7 +388,7 @@ module Celluloid
390
388
  end
391
389
 
392
390
  finalizer = @subject.class.finalizer
393
- if finalizer && @subject.respond_to?(finalizer)
391
+ if finalizer && @subject.respond_to?(finalizer, true)
394
392
  task(:finalizer, :finalize) { @subject.__send__(finalizer) }
395
393
  end
396
394
  rescue => ex
@@ -415,7 +413,7 @@ module Celluloid
415
413
 
416
414
  # Run a method inside a task unless it's exclusive
417
415
  def task(task_type, method_name = nil, &block)
418
- if @exclusives && (@exclusives == :all || @exclusives.include?(method_name.to_sym))
416
+ if @exclusives && (@exclusives == :all || (method_name && @exclusives.include?(method_name.to_sym)))
419
417
  exclusive { block.call }
420
418
  else
421
419
  @task_class.new(task_type, &block).resume
@@ -0,0 +1,16 @@
1
+ require 'celluloid'
2
+
3
+ Celluloid.boot
4
+
5
+ # Terminate all actors at exit
6
+ at_exit do
7
+ if defined?(RUBY_ENGINE) && RUBY_ENGINE == "ruby" && RUBY_VERSION >= "1.9"
8
+ # workaround for MRI bug losing exit status in at_exit block
9
+ # http://bugs.ruby-lang.org/issues/5218
10
+ exit_status = $!.status if $!.is_a?(SystemExit)
11
+ Celluloid.shutdown
12
+ exit exit_status if exit_status
13
+ else
14
+ Celluloid.shutdown
15
+ end
16
+ end
@@ -11,34 +11,37 @@ module Celluloid
11
11
  obj.public_send(@method, *@arguments, &@block)
12
12
  rescue NoMethodError => ex
13
13
  # Abort if the caller made a mistake
14
- detect_missing_method(ex)
14
+ raise AbortError.new(ex) unless obj.respond_to? @method
15
15
 
16
16
  # Otherwise something blew up. Crash this actor
17
17
  raise
18
18
  rescue ArgumentError => ex
19
19
  # Abort if the caller made a mistake
20
- detect_argument_error(ex)
21
-
22
- # Otherwise something blew up. Crash this actor
23
- raise
24
- end
25
-
26
- private
20
+ begin
21
+ arity = obj.method(@method).arity
22
+ rescue NameError
23
+ # In theory this shouldn't happen, but just in case
24
+ raise AbortError.new(ex)
25
+ end
27
26
 
28
- # Detect NoMethodErrors made by the caller and abort
29
- def detect_missing_method(ex)
30
- ex.backtrace.each do |frame|
31
- break if frame["celluloid/lib/celluloid/calls.rb"] || frame["`public_send'"]
32
- return unless frame["`method_missing'"]
27
+ if arity >= 0
28
+ raise AbortError.new(ex) if @arguments.size != arity
29
+ elsif arity < -1
30
+ mandatory_args = -arity - 1
31
+ raise AbortError.new(ex) if arguments.size < mandatory_args
33
32
  end
34
33
 
35
- raise AbortError.new(ex)
34
+ # Otherwise something blew up. Crash this actor
35
+ raise
36
36
  end
37
37
 
38
- # Detect ArgumentErrors made by the caller and abort
39
- def detect_argument_error(ex)
40
- if ex.backtrace[0]["`#{@method}'"] && ex.backtrace[1]["`public_send'"]
41
- raise AbortError.new(ex)
38
+ def wait
39
+ loop do
40
+ message = Thread.mailbox.receive do |msg|
41
+ msg.respond_to?(:call) and msg.call == self
42
+ end
43
+ break message unless message.is_a?(SystemEvent)
44
+ Thread.current[:celluloid_actor].handle_system_event(message)
42
45
  end
43
46
  end
44
47
  end
@@ -7,7 +7,7 @@ module Celluloid
7
7
 
8
8
  def initialize
9
9
  @mutex = Mutex.new
10
- @owner = Actor.current
10
+ @owner = Thread.current[:celluloid_actor]
11
11
  @tasks = []
12
12
  end
13
13
 
@@ -16,7 +16,9 @@ module Celluloid
16
16
  raise ConditionError, "cannot wait for signals while exclusive" if Celluloid.exclusive?
17
17
 
18
18
  @mutex.synchronize do
19
- raise ConditionError, "can't wait unless owner" unless Actor.current == @owner
19
+ actor = Thread.current[:celluloid_actor]
20
+ raise ConditionError, "can't wait for conditions outside actors" unless actor
21
+ raise ConditionError, "can't wait unless owner" unless actor == @owner
20
22
  @tasks << Task.current
21
23
  end
22
24
 
@@ -27,7 +29,9 @@ module Celluloid
27
29
 
28
30
  # Send a signal to the first task waiting on this condition
29
31
  def signal(value = nil)
30
- @mutex.synchronize do
32
+ @mutex.synchronize do
33
+ raise ConditionError, "no owner for this condition" unless @owner
34
+
31
35
  if task = @tasks.shift
32
36
  @owner.mailbox << SignalConditionRequest.new(task, value)
33
37
  else
@@ -39,6 +43,8 @@ module Celluloid
39
43
  # Broadcast a value to all waiting tasks
40
44
  def broadcast(value = nil)
41
45
  @mutex.synchronize do
46
+ raise ConditionError, "no owner for this condition" unless @owner
47
+
42
48
  @tasks.each { |task| @owner.mailbox << SignalConditionRequest.new(task, value) }
43
49
  @tasks.clear
44
50
  end
@@ -6,7 +6,11 @@ module Celluloid
6
6
  when 'darwin'
7
7
  @cores = Integer(`sysctl hw.ncpu`[/\d+/])
8
8
  when 'linux'
9
- @cores = File.read("/proc/cpuinfo").scan(/(?:core id|processor)\s+: \d+/).uniq.size
9
+ @cores = if File.exists?("/sys/devices/system/cpu/present")
10
+ File.read("/sys/devices/system/cpu/present").split('-').last.to_i+1
11
+ else
12
+ Dir["/sys/devices/system/cpu/cpu*"].select { |n| n=~/cpu\d+/ }.count
13
+ end
10
14
  when 'mingw', 'mswin'
11
15
  @cores = Integer(`SET NUMBER_OF_PROCESSORS`[/\d+/])
12
16
  else
@@ -16,3 +20,5 @@ module Celluloid
16
20
  def self.cores; @cores; end
17
21
  end
18
22
  end
23
+
24
+
@@ -77,7 +77,7 @@ module Celluloid
77
77
  if result
78
78
  result.value
79
79
  else
80
- raise "Timed out"
80
+ raise TimeoutError, "Timed out"
81
81
  end
82
82
  end
83
83
  alias_method :call, :value
@@ -53,7 +53,11 @@ module Celluloid
53
53
  # Format an exception message
54
54
  def format_exception(exception)
55
55
  str = "#{exception.class}: #{exception.to_s}\n\t"
56
- str << exception.backtrace.join("\n\t")
56
+ if exception.backtrace
57
+ str << exception.backtrace.join("\n\t")
58
+ else
59
+ str << "EMPTY BACKTRACE\n\t"
60
+ end
57
61
  end
58
62
  end
59
63
  end
@@ -113,7 +113,7 @@ module Celluloid
113
113
  signal :respawn_complete
114
114
  end
115
115
 
116
- def respond_to?(method)
116
+ def respond_to?(method, include_private = false)
117
117
  super || @worker_class.instance_methods.include?(method.to_sym)
118
118
  end
119
119
 
@@ -55,32 +55,40 @@ module Celluloid
55
55
 
56
56
  def dump(output = STDERR)
57
57
  @actors.each do |actor|
58
- output << "Celluloid::Actor 0x#{actor.subject_id.to_s(16)}: #{actor.subject_class}"
59
- output << " [#{actor.name}]" if actor.name
60
- output << "\n"
58
+ string = ""
59
+ string << "Celluloid::Actor 0x#{actor.subject_id.to_s(16)}: #{actor.subject_class}"
60
+ string << " [#{actor.name}]" if actor.name
61
+ string << "\n"
61
62
 
62
63
  if actor.status == :idle
63
- output << "State: Idle (waiting for messages)\n"
64
+ string << "State: Idle (waiting for messages)\n"
64
65
  else
65
- output << "State: Running (executing tasks)\n"
66
- output << "Tasks:\n"
66
+ string << "State: Running (executing tasks)\n"
67
+ string << "Tasks:\n"
67
68
 
68
69
  actor.tasks.each_with_index do |task, i|
69
- output << " #{i+1}) #{task.task_class}: #{task.status}\n"
70
+ string << " #{i+1}) #{task.task_class}: #{task.status}\n"
70
71
  end
71
72
  end
72
73
 
73
- display_backtrace actor.backtrace, output
74
+ display_backtrace actor.backtrace, string
75
+ output.print string
74
76
  end
75
77
 
76
78
  @threads.each do |thread|
77
- output << "Thread 0x#{thread.thread_id.to_s(16)}:\n"
78
- display_backtrace thread.backtrace, output
79
+ string = ""
80
+ string << "Thread 0x#{thread.thread_id.to_s(16)}:\n"
81
+ display_backtrace thread.backtrace, string
82
+ output.print string
79
83
  end
80
84
  end
81
85
 
82
86
  def display_backtrace(backtrace, output)
83
- output << "\t" << backtrace.join("\n\t") << "\n\n"
87
+ if backtrace
88
+ output << "\t" << backtrace.join("\n\t") << "\n\n"
89
+ else
90
+ output << "EMPTY BACKTRACE\n\n"
91
+ end
84
92
  end
85
93
  end
86
94
  end
@@ -60,7 +60,7 @@ module Celluloid
60
60
  @members = []
61
61
  @registry = registry || Registry.root
62
62
 
63
- yield self if block_given?
63
+ yield current_actor if block_given?
64
64
  end
65
65
 
66
66
  def supervise(klass, *args, &block)
@@ -25,6 +25,34 @@ module Celluloid
25
25
  @status = :new
26
26
  end
27
27
  end
28
+
29
+ class TaskSet
30
+ include Enumerable
31
+
32
+ def initialize
33
+ @tasks = Set.new
34
+ end
35
+
36
+ def <<(task)
37
+ @tasks += [task]
38
+ end
39
+
40
+ def delete(task)
41
+ @tasks -= [task]
42
+ end
43
+
44
+ def each(&blk)
45
+ @tasks.each &blk
46
+ end
47
+
48
+ def first
49
+ @tasks.first
50
+ end
51
+
52
+ def empty?
53
+ @tasks.empty?
54
+ end
55
+ end
28
56
  end
29
57
 
30
58
  require 'celluloid/tasks/task_fiber'
@@ -8,6 +8,7 @@ module Celluloid
8
8
  super
9
9
 
10
10
  @resume_queue = Queue.new
11
+ @exception_queue = Queue.new
11
12
  @yield_mutex = Mutex.new
12
13
  @yield_cond = ConditionVariable.new
13
14
 
@@ -19,8 +20,8 @@ module Celluloid
19
20
 
20
21
  @thread = Celluloid.internal_pool.get do
21
22
  begin
22
- ex = @resume_queue.pop.is_a?(Task::TerminatedError)
23
- raise ex if ex
23
+ ex = @resume_queue.pop
24
+ raise ex if ex.is_a?(Task::TerminatedError)
24
25
 
25
26
  @status = :running
26
27
  Thread.current[:celluloid_actor] = actor
@@ -32,6 +33,8 @@ module Celluloid
32
33
  yield
33
34
  rescue Task::TerminatedError
34
35
  # Task was explicitly terminated
36
+ rescue Exception => ex
37
+ @exception_queue << ex
35
38
  ensure
36
39
  @status = :dead
37
40
  actor.tasks.delete self
@@ -59,6 +62,9 @@ module Celluloid
59
62
  @yield_mutex.synchronize do
60
63
  @resume_queue.push(value)
61
64
  @yield_cond.wait(@yield_mutex)
65
+ while @exception_queue.size > 0
66
+ raise @exception_queue.pop
67
+ end
62
68
  end
63
69
 
64
70
  nil
@@ -1,4 +1,4 @@
1
1
  module Celluloid
2
- VERSION = '0.13.0.pre'
2
+ VERSION = '0.13.0.pre2'
3
3
  def self.version; VERSION; end
4
4
  end
@@ -130,6 +130,7 @@ shared_context "a Celluloid Actor" do |included_module|
130
130
  actor.run do
131
131
  Celluloid.actor?
132
132
  end.should be_true
133
+ actor.should be_actor
133
134
  end
134
135
 
135
136
  it "inspects properly" do
@@ -253,7 +254,7 @@ shared_context "a Celluloid Actor" do |included_module|
253
254
  actor.crash_with_abort_raw 10
254
255
  end.to raise_exception(TypeError, "Exception object/String expected, but Fixnum received")
255
256
 
256
- actor.greet rescue nil # Ensure our actor has died.
257
+ Celluloid::Actor.join(actor)
257
258
  actor.should_not be_alive
258
259
  end
259
260
  end
@@ -690,6 +691,22 @@ shared_context "a Celluloid Actor" do |included_module|
690
691
  sleep(interval + Celluloid::TIMER_QUANTUM) # wonky! #/
691
692
  actor.should_not be_fired
692
693
  end
694
+
695
+ it "allows delays from outside the actor" do
696
+ actor = @klass.new
697
+
698
+ interval = Celluloid::TIMER_QUANTUM * 10
699
+ started_at = Time.now
700
+ fired = false
701
+
702
+ timer = actor.after(interval) do
703
+ fired = true
704
+ end
705
+ fired.should be_false
706
+
707
+ sleep(interval + Celluloid::TIMER_QUANTUM) # wonky! #/
708
+ fired.should be_true
709
+ end
693
710
  end
694
711
 
695
712
  context :tasks do
@@ -22,6 +22,10 @@ module ExampleActorClass
22
22
  "Hi, I'm #{@name}"
23
23
  end
24
24
 
25
+ def actor?
26
+ Celluloid.actor?
27
+ end
28
+
25
29
  def run(*args)
26
30
  yield(*args)
27
31
  end
@@ -33,4 +33,13 @@ shared_context "a Celluloid Task" do |task_class|
33
33
  subject.should_not be_running
34
34
  end
35
35
 
36
+ it "raises exceptions outside" do
37
+ task = task_class.new(task_type) do
38
+ raise "failure"
39
+ end
40
+ expect do
41
+ task.resume
42
+ end.to raise_exception("failure")
43
+ end
44
+
36
45
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: celluloid
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.13.0.pre
4
+ version: 0.13.0.pre2
5
5
  prerelease: 7
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-02-14 00:00:00.000000000 Z
12
+ date: 2013-03-17 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: timers
@@ -101,7 +101,7 @@ extra_rdoc_files: []
101
101
  files:
102
102
  - README.md
103
103
  - lib/celluloid/actor.rb
104
- - lib/celluloid/boot.rb
104
+ - lib/celluloid/autostart.rb
105
105
  - lib/celluloid/calls.rb
106
106
  - lib/celluloid/condition.rb
107
107
  - lib/celluloid/core_ext.rb
@@ -1,23 +0,0 @@
1
- # Things to run after Celluloid is fully loaded
2
-
3
- # Configure default systemwide settings
4
- Celluloid.task_class = Celluloid::TaskFiber
5
- Celluloid.logger = Logger.new(STDERR)
6
-
7
- # Launch default services
8
- # FIXME: We should set up the supervision hierarchy here
9
- Celluloid::Notifications::Fanout.supervise_as :notifications_fanout
10
- Celluloid::IncidentReporter.supervise_as :default_incident_reporter, STDERR
11
-
12
- # Terminate all actors at exit
13
- at_exit do
14
- if defined?(RUBY_ENGINE) && RUBY_ENGINE == "ruby" && RUBY_VERSION >= "1.9"
15
- # workaround for MRI bug losing exit status in at_exit block
16
- # http://bugs.ruby-lang.org/issues/5218
17
- exit_status = $!.status if $!.is_a?(SystemExit)
18
- Celluloid.shutdown
19
- exit exit_status if exit_status
20
- else
21
- Celluloid.shutdown
22
- end
23
- end