Skip to content

Commit 7d3a0fb

Browse files
committed
Broadcast to linked actors error the cause of pausing
1 parent 3a32d3e commit 7d3a0fb

File tree

3 files changed

+22
-9
lines changed

3 files changed

+22
-9
lines changed

lib/concurrent/actor/behaviour.rb

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -199,9 +199,9 @@ def on_envelope(envelope)
199199
end
200200
end
201201

202-
def pause!
202+
def pause!(error = nil)
203203
@paused = true
204-
broadcast(:paused)
204+
broadcast(error || :paused)
205205
true
206206
end
207207

@@ -268,7 +268,7 @@ def on_envelope(envelope)
268268
when :terminate
269269
terminate!
270270
when :pause
271-
behaviour!(Pausing).pause!
271+
behaviour!(Pausing).pause!(error)
272272
else
273273
raise
274274
end
@@ -336,7 +336,7 @@ def on_envelope(envelope)
336336

337337
class ErrorOnUnknownMessage < Abstract
338338
def on_envelope(envelope)
339-
raise "unknown message #{envelope.message.inspect}"
339+
raise UnknownMessage, envelope
340340
end
341341
end
342342

lib/concurrent/actor/errors.rb

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,23 @@ module Actor
55
class ActorTerminated < Error
66
include TypeCheck
77

8+
attr_reader :reference
9+
810
def initialize(reference)
9-
Type! reference, Reference
11+
@reference = Type! reference, Reference
1012
super reference.path
1113
end
1214
end
15+
16+
class UnknownMessage < Error
17+
include TypeCheck
18+
19+
attr_reader :envelope
20+
21+
def initialize(envelope)
22+
@envelope = Type! envelope, Envelope
23+
super envelope.message.inspect
24+
end
25+
end
1326
end
1427
end

spec/concurrent/actor_spec.rb

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -288,7 +288,7 @@ def on_message(message)
288288

289289
-> m do
290290
queue << m
291-
if m == :paused
291+
if UnknownMessage === m
292292
ivar = envelope.sender.ask(:add)
293293
envelope.sender << :resume!
294294
queue << ivar.value!
@@ -298,7 +298,7 @@ def on_message(message)
298298

299299
expect(queue.pop).to eq :init
300300
expect(queue.pop).to eq test
301-
expect(queue.pop).to eq :paused
301+
expect(queue.pop).to be_kind_of(UnknownMessage)
302302
expect(queue.pop).to eq 1
303303
expect(queue.pop).to eq :resumed
304304
terminate_actors test
@@ -314,7 +314,7 @@ def on_message(message)
314314

315315
-> m do
316316
queue << m
317-
if m == :paused
317+
if UnknownMessage === m
318318
ivar = envelope.sender.ask(:add)
319319
envelope.sender << :reset!
320320
queue << ivar.value!
@@ -324,7 +324,7 @@ def on_message(message)
324324

325325
expect(queue.pop).to eq :init
326326
expect(queue.pop).to eq test
327-
expect(queue.pop).to eq :paused
327+
expect(queue.pop).to be_kind_of(UnknownMessage)
328328
expect(queue.pop).to eq :init # rebuilds context
329329
expect(queue.pop).to eq 1
330330
expect(queue.pop).to eq :reset

0 commit comments

Comments
 (0)