@@ -6,14 +6,16 @@ using UUIDs
66abstract type AbstractSimpleCarrier <: Carrier end
77
88"""
9- ActorContainer
9+ ActorContainer
1010
1111 A container to manage multiple `SimpleCarrier`.
1212"""
13- struct ActorContainer
13+ mutable struct ActorContainer
1414 actors:: Vector{AbstractSimpleCarrier}
15+ active_tasks:: Threads.Atomic{Int}
16+ done_event:: Base.Event
1517 function ActorContainer ()
16- return new (Vector {AbstractSimpleCarrier} ())
18+ return new (Vector {AbstractSimpleCarrier} (), Threads . Atomic {Int} ( 0 ), Base . Event () )
1719 end
1820end
1921
@@ -65,8 +67,15 @@ function send_to_other(carrier::SimpleCarrier, content::Any, receiver::Real; met
6567 other_carrier:: Carrier = carrier. container. actors[receiver]
6668 main_meta = Dict (:sender => carrier. aid, :message_id => uuid4 ())
6769 union_meta = merge (main_meta, meta) # important: meta can override main_meta entries
70+ Threads. atomic_add! (carrier. container. active_tasks, 1 )
6871 return @spawnlog begin
69- _dispatch_to (other_carrier, content, union_meta)
72+ try
73+ _dispatch_to (other_carrier, content, union_meta)
74+ finally
75+ if Threads. atomic_sub! (carrier. container. active_tasks, 1 ) == 1
76+ notify (carrier. container. done_event)
77+ end
78+ end
7079 end
7180end
7281
@@ -113,7 +122,8 @@ Return a waitable object that can be used to monitor the progress of the optimiz
113122function start_distributed_optimization (actors:: Vector{<:DistributedAlgorithm} , start_message:: Any )
114123 actor_container = ActorContainer ()
115124 carriers = [SimpleCarrier (actor_container, actor) for actor in actors]
116- return send_to_other (carriers[1 ], start_message, cid (carriers[2 ]))
125+ send_to_other (carriers[1 ], start_message, cid (carriers[2 ]))
126+ return Threads. @spawn wait (actor_container. done_event)
117127end
118128
119129"""
0 commit comments