@@ -279,6 +279,16 @@ typealias DefaultDistributedActorSystem = FakeActorSystem
279279
280280func test( ) {
281281 let group = DispatchGroup ( )
282+ var dummy : AnyObject ?
283+
284+ func check( factory: ( ) -> AnyObject ) {
285+ dummy = factory ( )
286+ // Test requires actor system to be released before the actor,
287+ // so that release of the actor system from actor deinit is the last one
288+ group. enter ( )
289+ dummy = nil
290+ group. wait ( )
291+ }
282292
283293 // no lifecycle things make sense for a normal actor, double check we didn't emit them
284294 print ( " before A " )
@@ -287,117 +297,97 @@ func test() {
287297 // CHECK: before A
288298 // CHECK: after A
289299
290- group. enter ( )
291- _ = { ( ) -> DA in
300+ check {
292301 DA ( system: DefaultDistributedActorSystem ( group: group) )
293- } ( )
294- group. wait ( )
302+ }
295303 // CHECK: assign type:DA, address:[[ADDRESS:.*]]
296304 // CHECK: ready actor:main.DA, address:ActorAddress(address: "[[ADDR1:addr-[0-9]]]")
297305 // CHECK: resign address:ActorAddress(address: "[[ADDR1]]")
298306 // CHECK-NEXT: Deinit ActorSystem: mainExecutor=true mainThread=true
299307
300- group. enter ( )
301- _ = { ( ) -> DA_userDefined in
308+ check {
302309 DA_userDefined ( system: DefaultDistributedActorSystem ( group: group) )
303- } ( )
304- group. wait ( )
310+ }
305311 // CHECK: assign type:DA_userDefined, address:[[ADDRESS:.*]]
306312 // CHECK: ready actor:main.DA_userDefined, address:ActorAddress(address: "[[ADDR2:addr-[0-9]]]")
307313 // CHECK: resign address:ActorAddress(address: "[[ADDR2]]")
308314 // CHECK-NEXT: Deinit ActorSystem: mainExecutor=true mainThread=true
309315
310316 // resign must happen as the _last thing_ after user-deinit completed
311- group. enter ( )
312- _ = { ( ) -> DA_userDefined_nonisolated in
317+ check {
313318 DA_userDefined_nonisolated ( system: DefaultDistributedActorSystem ( group: group) )
314- } ( )
315- group. wait ( )
319+ }
316320 // CHECK: assign type:DA_userDefined_nonisolated, address:[[ADDRESS:.*]]
317321 // CHECK: ready actor:main.DA_userDefined_nonisolated, address:ActorAddress(address: "[[ADDR3:addr-[0-9]]]")
318322 // CHECK: Deinitializing ActorAddress(address: "[[ADDR3]]") remote:false isolated:false mainThread:true
319323 // CHECK-NEXT: resign address:ActorAddress(address: "[[ADDR3]]")
320324 // CHECK-NEXT: Deinit ActorSystem: mainExecutor=true mainThread=true
321325
322326 // resign must happen as the _last thing_ after user-deinit completed
323- group. enter ( )
324- _ = { ( ) -> DA_userDefined_isolated in
327+ check {
325328 DA_userDefined_isolated ( system: DefaultDistributedActorSystem ( group: group) )
326- } ( )
327- group. wait ( )
329+ }
328330 // CHECK: assign type:DA_userDefined_isolated, address:[[ADDRESS:.*]]
329331 // CHECK: ready actor:main.DA_userDefined_isolated, address:ActorAddress(address: "[[ADDR4:addr-[0-9]]]")
330332 // CHECK: Deinitializing ActorAddress(address: "[[ADDR4]]") remote:false isolated:true mainThread:true
331333 // CHECK-NEXT: resign address:ActorAddress(address: "[[ADDR4]]")
332334 // CHECK-NEXT: Deinit ActorSystem: mainExecutor=false mainThread=true
333335
334336 // resign must happen as the _last thing_ after user-deinit completed
335- group. enter ( )
336- _ = { ( ) -> DA_state_nonisolated in
337+ check {
337338 DA_state_nonisolated ( name: " Foo " , age: 37 , system: DefaultDistributedActorSystem ( group: group) )
338- } ( )
339- group. wait ( )
339+ }
340340 // CHECK: assign type:DA_state_nonisolated, address:[[ADDRESS:.*]]
341341 // CHECK: ready actor:main.DA_state_nonisolated, address:ActorAddress(address: "[[ADDR5:addr-[0-9]]]")
342342 // CHECK: Deinitializing ActorAddress(address: "[[ADDR5]]") name=Foo age=37 remote:false isolated:false mainThread:true
343343 // CHECK-NEXT: resign address:ActorAddress(address: "[[ADDR5]]")
344344 // CHECK-NEXT: Deinit ActorSystem: mainExecutor=true mainThread=true
345345
346346 // resign must happen as the _last thing_ after user-deinit completed
347- group. enter ( )
348- _ = { ( ) -> DA_state_isolated in
347+ check {
349348 DA_state_isolated ( name: " Bar " , age: 42 , system: DefaultDistributedActorSystem ( group: group) )
350- } ( )
351- group. wait ( )
349+ }
352350 // CHECK: assign type:DA_state_isolated, address:[[ADDRESS:.*]]
353351 // CHECK: ready actor:main.DA_state_isolated, address:ActorAddress(address: "[[ADDR6:addr-[0-9]]]")
354352 // CHECK: Deinitializing ActorAddress(address: "[[ADDR6]]") name=Bar age=42 remote:false isolated:true mainThread:true
355353 // CHECK-NEXT: resign address:ActorAddress(address: "[[ADDR6]]")
356354 // CHECK-NEXT: Deinit ActorSystem: mainExecutor=false mainThread=true
357355
358356 // resign must happen as the _last thing_ after user-deinit completed
359- group. enter ( )
360- _ = { ( ) -> DA_state_isolated_on_another in
357+ check {
361358 DA_state_isolated_on_another ( name: " Baz " , age: 57 , system: DefaultDistributedActorSystem ( group: group) )
362- } ( )
363- group. wait ( )
359+ }
364360 // CHECK: assign type:DA_state_isolated_on_another, address:[[ADDRESS:.*]]
365361 // CHECK: ready actor:main.DA_state_isolated_on_another, address:ActorAddress(address: "[[ADDR6:addr-[0-9]]]")
366362 // CHECK: Deinitializing ActorAddress(address: "[[ADDR6]]") name=Baz age=57 remote:false isolated-self:false isolated-other:true mainThread:false
367363 // CHECK-NEXT: resign address:ActorAddress(address: "[[ADDR6]]")
368364 // CHECK-NEXT: Deinit ActorSystem: mainExecutor=false mainThread=false
369365
370366 // a remote actor should not resign it's address, it was never "assigned" it
371- group. enter ( )
372- _ = { ( ) -> DA_userDefined_nonisolated in
367+ check {
373368 let address = ActorAddress ( parse: " remote-1 " )
374369 return try ! DA_userDefined_nonisolated . resolve ( id: address, using: DefaultDistributedActorSystem ( group: group) )
375- } ( )
376- group. wait ( )
370+ }
377371 // CHECK-NEXT: resolve type:DA_userDefined_nonisolated, address:ActorAddress(address: "remote-1")
378372 // MUST NOT run deinit body for a remote distributed actor
379373 // CHECK-NOT: Deinitializing ActorAddress(address: "remote-1")
380374 // CHECK-NEXT: Deinit ActorSystem: mainExecutor=true mainThread=true
381375
382376 // a remote actor should not resign it's address, it was never "assigned" it
383- group. enter ( )
384- _ = { ( ) -> DA_userDefined_isolated in
377+ check {
385378 let address = ActorAddress ( parse: " remote-2 " )
386379 return try ! DA_userDefined_isolated . resolve ( id: address, using: DefaultDistributedActorSystem ( group: group) )
387- } ( )
388- group. wait ( )
380+ }
389381 // CHECK-NEXT: resolve type:DA_userDefined_isolated, address:ActorAddress(address: "remote-2")
390382 // MUST NOT run deinit body for a remote distributed actor
391383 // CHECK-NOT: Deinitializing ActorAddress(address: "remote-2")
392384 // CHECK-NEXT: Deinit ActorSystem: mainExecutor=true mainThread=true
393385
394386 // a remote actor should not resign it's address, it was never "assigned" it
395- group. enter ( )
396- _ = { ( ) -> DA_state_isolated_on_another in
387+ check {
397388 let address = ActorAddress ( parse: " remote-3 " )
398389 return try ! DA_state_isolated_on_another . resolve ( id: address, using: DefaultDistributedActorSystem ( group: group) )
399- } ( )
400- group. wait ( )
390+ }
401391 // CHECK-NEXT: resolve type:DA_state_isolated_on_another, address:ActorAddress(address: "remote-3")
402392 // MUST NOT run deinit body for a remote distributed actor
403393 // CHECK-NOT: Deinitializing ActorAddress(address: "remote-3")
0 commit comments