celluloid 0.2.2 → 0.5.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.
- data/README.md +214 -67
- data/lib/celluloid.rb +144 -13
- data/lib/celluloid/actor.rb +152 -246
- data/lib/celluloid/actor_pool.rb +57 -0
- data/lib/celluloid/actor_proxy.rb +29 -19
- data/lib/celluloid/core_ext.rb +9 -2
- data/lib/celluloid/io.rb +50 -0
- data/lib/celluloid/io/actor.rb +10 -0
- data/lib/celluloid/io/mailbox.rb +65 -0
- data/lib/celluloid/io/reactor.rb +63 -0
- data/lib/celluloid/io/waker.rb +43 -0
- data/lib/celluloid/linking.rb +24 -20
- data/lib/celluloid/mailbox.rb +43 -30
- data/lib/celluloid/registry.rb +0 -5
- data/lib/celluloid/rspec.rb +2 -0
- data/lib/celluloid/supervisor.rb +4 -4
- data/lib/celluloid/tcp_server.rb +32 -0
- data/lib/celluloid/version.rb +1 -1
- metadata +45 -45
data/lib/celluloid/mailbox.rb
CHANGED
@@ -2,30 +2,31 @@ require 'thread'
|
|
2
2
|
|
3
3
|
module Celluloid
|
4
4
|
class MailboxError < StandardError; end # you can't message the dead
|
5
|
-
|
5
|
+
class MailboxShutdown < StandardError; end # raised if the mailbox can no longer be used
|
6
|
+
|
6
7
|
# Actors communicate with asynchronous messages. Messages are buffered in
|
7
8
|
# Mailboxes until Actors can act upon them.
|
8
9
|
class Mailbox
|
9
10
|
include Enumerable
|
10
|
-
|
11
|
+
|
11
12
|
def initialize
|
12
13
|
@messages = []
|
13
14
|
@lock = Mutex.new
|
14
|
-
@condition = ConditionVariable.new
|
15
15
|
@dead = false
|
16
|
+
@condition = ConditionVariable.new
|
16
17
|
end
|
17
|
-
|
18
|
+
|
18
19
|
# Add a message to the Mailbox
|
19
20
|
def <<(message)
|
20
21
|
@lock.synchronize do
|
21
22
|
raise MailboxError, "dead recipient" if @dead
|
22
|
-
|
23
|
+
|
23
24
|
@messages << message
|
24
25
|
@condition.signal
|
25
26
|
end
|
26
27
|
nil
|
27
28
|
end
|
28
|
-
|
29
|
+
|
29
30
|
# Add a high-priority system event to the Mailbox
|
30
31
|
def system_event(event)
|
31
32
|
@lock.synchronize do
|
@@ -36,56 +37,68 @@ module Celluloid
|
|
36
37
|
end
|
37
38
|
nil
|
38
39
|
end
|
39
|
-
|
40
|
+
|
40
41
|
# Receive a message from the Mailbox
|
41
|
-
def receive
|
42
|
+
def receive(&block)
|
42
43
|
message = nil
|
43
|
-
|
44
|
+
|
44
45
|
@lock.synchronize do
|
45
46
|
raise MailboxError, "attempted to receive from a dead mailbox" if @dead
|
46
|
-
|
47
|
+
|
47
48
|
begin
|
48
|
-
|
49
|
-
index = @messages.index do |msg|
|
50
|
-
yield(msg) || msg.is_a?(Celluloid::SystemEvent)
|
51
|
-
end
|
52
|
-
|
53
|
-
message = @messages.slice!(index, 1).first if index
|
54
|
-
else
|
55
|
-
message = @messages.shift
|
56
|
-
end
|
57
|
-
|
58
|
-
raise message if message.is_a?(Celluloid::SystemEvent)
|
59
|
-
|
49
|
+
message = next_message(&block)
|
60
50
|
@condition.wait(@lock) unless message
|
61
51
|
end until message
|
62
52
|
end
|
63
|
-
|
53
|
+
|
54
|
+
message
|
55
|
+
end
|
56
|
+
|
57
|
+
# Retrieve the next message in the mailbox
|
58
|
+
def next_message
|
59
|
+
message = nil
|
60
|
+
|
61
|
+
if block_given?
|
62
|
+
index = @messages.index do |msg|
|
63
|
+
yield(msg) || msg.is_a?(Celluloid::SystemEvent)
|
64
|
+
end
|
65
|
+
|
66
|
+
message = @messages.slice!(index, 1).first if index
|
67
|
+
else
|
68
|
+
message = @messages.shift
|
69
|
+
end
|
70
|
+
|
71
|
+
raise message if message.is_a?(Celluloid::SystemEvent)
|
64
72
|
message
|
65
73
|
end
|
66
|
-
|
74
|
+
|
67
75
|
# Shut down this mailbox and clean up its contents
|
68
76
|
def shutdown
|
77
|
+
messages = nil
|
78
|
+
|
69
79
|
@lock.synchronize do
|
70
|
-
|
71
|
-
@messages
|
80
|
+
messages = @messages
|
81
|
+
@messages = []
|
72
82
|
@dead = true
|
73
83
|
end
|
84
|
+
|
85
|
+
messages.each { |msg| msg.cleanup if msg.respond_to? :cleanup }
|
86
|
+
true
|
74
87
|
end
|
75
|
-
|
88
|
+
|
76
89
|
# Cast to an array
|
77
90
|
def to_a
|
78
91
|
@lock.synchronize { @messages.dup }
|
79
92
|
end
|
80
|
-
|
93
|
+
|
81
94
|
# Iterate through the mailbox
|
82
95
|
def each(&block)
|
83
96
|
to_a.each(&block)
|
84
97
|
end
|
85
|
-
|
98
|
+
|
86
99
|
# Inspect the contents of the Mailbox
|
87
100
|
def inspect
|
88
101
|
"#<Celluloid::Mailbox:#{object_id} [#{map { |m| m.inspect }.join(', ')}]>"
|
89
102
|
end
|
90
103
|
end
|
91
|
-
end
|
104
|
+
end
|
data/lib/celluloid/registry.rb
CHANGED
data/lib/celluloid/supervisor.rb
CHANGED
@@ -2,18 +2,18 @@ module Celluloid
|
|
2
2
|
# Supervisors are actors that watch over other actors and restart them if
|
3
3
|
# they crash
|
4
4
|
class Supervisor
|
5
|
-
include
|
5
|
+
include Celluloid
|
6
6
|
trap_exit :restart_actor
|
7
7
|
|
8
8
|
# Retrieve the actor this supervisor is supervising
|
9
9
|
attr_reader :actor
|
10
10
|
|
11
11
|
def self.supervise(klass, *args, &block)
|
12
|
-
|
12
|
+
new(nil, klass, *args, &block)
|
13
13
|
end
|
14
14
|
|
15
15
|
def self.supervise_as(name, klass, *args, &block)
|
16
|
-
|
16
|
+
new(name, klass, *args, &block)
|
17
17
|
end
|
18
18
|
|
19
19
|
def initialize(name, klass, *args, &block)
|
@@ -22,7 +22,7 @@ module Celluloid
|
|
22
22
|
end
|
23
23
|
|
24
24
|
def start_actor
|
25
|
-
@actor = @klass.
|
25
|
+
@actor = @klass.new_link(*@args, &@block)
|
26
26
|
Celluloid::Actor[@name] = @actor if @name
|
27
27
|
end
|
28
28
|
|
@@ -0,0 +1,32 @@
|
|
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) { on_connect @server.accept }
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
# Terminate this server
|
22
|
+
def terminate
|
23
|
+
@server.close
|
24
|
+
super
|
25
|
+
end
|
26
|
+
|
27
|
+
# Called whenever a new connection is opened
|
28
|
+
def on_connect(connection)
|
29
|
+
connection.close
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
data/lib/celluloid/version.rb
CHANGED
metadata
CHANGED
@@ -1,92 +1,92 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: celluloid
|
3
|
-
version: !ruby/object:Gem::Version
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.5.0
|
4
5
|
prerelease:
|
5
|
-
version: 0.2.2
|
6
6
|
platform: ruby
|
7
|
-
authors:
|
7
|
+
authors:
|
8
8
|
- Tony Arcieri
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
dependencies:
|
16
|
-
- !ruby/object:Gem::Dependency
|
12
|
+
date: 2011-10-25 00:00:00.000000000Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
17
15
|
name: rake
|
18
|
-
|
19
|
-
requirement: &id001 !ruby/object:Gem::Requirement
|
16
|
+
requirement: &70182211411320 !ruby/object:Gem::Requirement
|
20
17
|
none: false
|
21
|
-
requirements:
|
22
|
-
- -
|
23
|
-
- !ruby/object:Gem::Version
|
24
|
-
version:
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
25
22
|
type: :development
|
26
|
-
version_requirements: *id001
|
27
|
-
- !ruby/object:Gem::Dependency
|
28
|
-
name: rspec
|
29
23
|
prerelease: false
|
30
|
-
|
24
|
+
version_requirements: *70182211411320
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: rspec
|
27
|
+
requirement: &70182211410760 !ruby/object:Gem::Requirement
|
31
28
|
none: false
|
32
|
-
requirements:
|
33
|
-
- -
|
34
|
-
- !ruby/object:Gem::Version
|
35
|
-
version: 2.
|
29
|
+
requirements:
|
30
|
+
- - ! '>='
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: 2.7.0
|
36
33
|
type: :development
|
37
|
-
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: *70182211410760
|
38
36
|
description: Celluloid is a concurrent object framework inspired by the Actor Model
|
39
|
-
email:
|
37
|
+
email:
|
40
38
|
- tony@medioh.com
|
41
39
|
executables: []
|
42
|
-
|
43
40
|
extensions: []
|
44
|
-
|
45
41
|
extra_rdoc_files: []
|
46
|
-
|
47
|
-
files:
|
42
|
+
files:
|
48
43
|
- README.md
|
49
44
|
- lib/celluloid/actor.rb
|
45
|
+
- lib/celluloid/actor_pool.rb
|
50
46
|
- lib/celluloid/actor_proxy.rb
|
51
47
|
- lib/celluloid/calls.rb
|
52
48
|
- lib/celluloid/core_ext.rb
|
53
49
|
- lib/celluloid/events.rb
|
54
50
|
- lib/celluloid/future.rb
|
51
|
+
- lib/celluloid/io/actor.rb
|
52
|
+
- lib/celluloid/io/mailbox.rb
|
53
|
+
- lib/celluloid/io/reactor.rb
|
54
|
+
- lib/celluloid/io/waker.rb
|
55
|
+
- lib/celluloid/io.rb
|
55
56
|
- lib/celluloid/linking.rb
|
56
57
|
- lib/celluloid/mailbox.rb
|
57
58
|
- lib/celluloid/registry.rb
|
58
59
|
- lib/celluloid/responses.rb
|
60
|
+
- lib/celluloid/rspec.rb
|
59
61
|
- lib/celluloid/signals.rb
|
60
62
|
- lib/celluloid/supervisor.rb
|
63
|
+
- lib/celluloid/tcp_server.rb
|
61
64
|
- lib/celluloid/version.rb
|
62
65
|
- lib/celluloid.rb
|
63
|
-
has_rdoc: true
|
64
66
|
homepage: https://github.com/tarcieri/celluloid
|
65
|
-
licenses:
|
67
|
+
licenses:
|
66
68
|
- MIT
|
67
69
|
post_install_message:
|
68
70
|
rdoc_options: []
|
69
|
-
|
70
|
-
require_paths:
|
71
|
+
require_paths:
|
71
72
|
- lib
|
72
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
73
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
73
74
|
none: false
|
74
|
-
requirements:
|
75
|
-
- -
|
76
|
-
- !ruby/object:Gem::Version
|
77
|
-
version:
|
78
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
75
|
+
requirements:
|
76
|
+
- - ! '>='
|
77
|
+
- !ruby/object:Gem::Version
|
78
|
+
version: '0'
|
79
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
79
80
|
none: false
|
80
|
-
requirements:
|
81
|
-
- -
|
82
|
-
- !ruby/object:Gem::Version
|
81
|
+
requirements:
|
82
|
+
- - ! '>='
|
83
|
+
- !ruby/object:Gem::Version
|
83
84
|
version: 1.3.6
|
84
85
|
requirements: []
|
85
|
-
|
86
86
|
rubyforge_project:
|
87
|
-
rubygems_version: 1.
|
87
|
+
rubygems_version: 1.8.10
|
88
88
|
signing_key:
|
89
89
|
specification_version: 3
|
90
90
|
summary: Celluloid is a concurrent object framework inspired by the Actor Model
|
91
91
|
test_files: []
|
92
|
-
|
92
|
+
has_rdoc:
|