Class: Celluloid::ActorSystem

Inherits:
Object
  • Object
show all
Extended by:
Forwardable
Defined in:
lib/celluloid/actor_system.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeActorSystem


5
6
7
8
# File 'lib/celluloid/actor_system.rb', line 5

def initialize
  @internal_pool = InternalPool.new
  @registry      = Registry.new
end

Instance Attribute Details

#registryObject (readonly)

Returns the value of attribute registry


9
10
11
# File 'lib/celluloid/actor_system.rb', line 9

def registry
  @registry
end

Instance Method Details

#assert_inactiveObject


99
100
101
# File 'lib/celluloid/actor_system.rb', line 99

def assert_inactive
  @internal_pool.assert_inactive
end

#clear_registryObject


46
47
48
# File 'lib/celluloid/actor_system.rb', line 46

def clear_registry
  @registry.clear
end

#get_threadObject


29
30
31
32
33
34
# File 'lib/celluloid/actor_system.rb', line 29

def get_thread
  @internal_pool.get do
    Thread.current[:celluloid_actor_system] = self
    yield
  end
end

#registeredObject


42
43
44
# File 'lib/celluloid/actor_system.rb', line 42

def registered
  @registry.names
end

#runningObject


50
51
52
53
54
55
56
57
# File 'lib/celluloid/actor_system.rb', line 50

def running
  actors = []
  @internal_pool.each do |t|
    next unless t.role == :actor
    actors << t.actor.behavior_proxy if t.actor && t.actor.respond_to?(:behavior_proxy)
  end
  actors
end

#running?Boolean


59
60
61
# File 'lib/celluloid/actor_system.rb', line 59

def running?
  @internal_pool.running?
end

#shutdownObject

Shut down all running actors


64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
# File 'lib/celluloid/actor_system.rb', line 64

def shutdown
  actors = running
  Timeout.timeout(shutdown_timeout) do
    Logger.debug "Terminating #{actors.size} #{(actors.size > 1) ? 'actors' : 'actor'}..." if actors.size > 0

    # Actors cannot self-terminate, you must do it for them
    actors.each do |actor|
      begin
        actor.terminate!
      rescue DeadActorError
      end
    end

    actors.each do |actor|
      begin
        Actor.join(actor)
      rescue DeadActorError
      end
    end

    @internal_pool.shutdown
  end
rescue Timeout::Error
  Logger.error("Couldn't cleanly terminate all actors in #{shutdown_timeout} seconds!")
  actors.each do |actor|
    begin
      Actor.kill(actor)
    rescue DeadActorError, MailboxDead
    end
  end
ensure
  @internal_pool.kill
  clear_registry
end

#shutdown_timeoutObject


103
104
105
# File 'lib/celluloid/actor_system.rb', line 103

def shutdown_timeout
  Celluloid.shutdown_timeout
end

#stack_dumpObject


36
37
38
# File 'lib/celluloid/actor_system.rb', line 36

def stack_dump
  Celluloid::StackDump.new(@internal_pool)
end

#startObject

Launch default services FIXME: We should set up the supervision hierarchy here


13
14
15
16
17
18
19
# File 'lib/celluloid/actor_system.rb', line 13

def start
  within do
    Celluloid::Notifications::Fanout.supervise_as :notifications_fanout
    Celluloid::IncidentReporter.supervise_as :default_incident_reporter, STDERR
  end
  true
end

#withinObject


21
22
23
24
25
26
27
# File 'lib/celluloid/actor_system.rb', line 21

def within
  old = Thread.current[:celluloid_actor_system]
  Thread.current[:celluloid_actor_system] = self
  yield
ensure
  Thread.current[:celluloid_actor_system] = old
end