@@ -353,7 +353,7 @@ public open class JobSupport constructor(active: Boolean) : Job, ChildJob, Paren
353
353
}
354
354
355
355
private fun NodeList.notifyCompletion (cause : Throwable ? ) {
356
- close(LIST_MAX_PERMISSION )
356
+ close(LIST_ON_COMPLETION_PERMISSION )
357
357
notifyHandlers<JobNode >(this , cause)
358
358
}
359
359
@@ -466,13 +466,13 @@ public open class JobSupport constructor(active: Boolean) : Job, ChildJob, Paren
466
466
if (onCancelling) {
467
467
val rootCause = (state as ? Finishing )?.let { synchronized(it) { it.rootCause } }
468
468
if (rootCause == null ) {
469
- list.addLast(node, LIST_CANCELLATION_PERMISSION )
469
+ list.addLast(node, LIST_CANCELLATION_PERMISSION or LIST_ON_COMPLETION_PERMISSION )
470
470
} else {
471
471
if (invokeImmediately) handler.invoke(rootCause)
472
472
return NonDisposableHandle
473
473
}
474
474
} else {
475
- list.addLast(node, LIST_MAX_PERMISSION )
475
+ list.addLast(node, LIST_ON_COMPLETION_PERMISSION )
476
476
}
477
477
}
478
478
when {
@@ -988,14 +988,20 @@ public open class JobSupport constructor(active: Boolean) : Job, ChildJob, Paren
988
988
val node = ChildHandleNode (child).also { it.job = this }
989
989
val added = tryPutNodeIntoList(node) { _, list ->
990
990
// First, try to add a child along the cancellation handlers
991
- val addedBeforeCancellation = list.addLast(node, LIST_CANCELLATION_PERMISSION )
991
+ val addedBeforeCancellation = list.addLast(
992
+ node,
993
+ LIST_ON_COMPLETION_PERMISSION or LIST_CHILD_PERMISSION or LIST_CANCELLATION_PERMISSION
994
+ )
992
995
if (addedBeforeCancellation) {
993
996
// The child managed to be added before the parent started to cancel or complete. Success.
994
997
true
995
998
} else {
996
999
// Either cancellation or completion already happened, the child was not added.
997
1000
// Now we need to try adding it for completion.
998
- val addedBeforeCompletion = list.addLast(node, LIST_CHILD_PERMISSION )
1001
+ val addedBeforeCompletion = list.addLast(
1002
+ node,
1003
+ LIST_CHILD_PERMISSION or LIST_ON_COMPLETION_PERMISSION
1004
+ )
999
1005
// Whether or not we managed to add the child before the parent completed, we need to investigate:
1000
1006
// why didn't we manage to add it before cancellation?
1001
1007
// If it's because cancellation happened in the meantime, we need to notify the child.
@@ -1353,9 +1359,10 @@ private val SEALED = Symbol("SEALED")
1353
1359
private val EMPTY_NEW = Empty (false )
1354
1360
private val EMPTY_ACTIVE = Empty (true )
1355
1361
1356
- private const val LIST_MAX_PERMISSION = Int .MAX_VALUE
1357
- private const val LIST_CHILD_PERMISSION = 1
1358
- private const val LIST_CANCELLATION_PERMISSION = 0
1362
+ // bit mask
1363
+ private const val LIST_ON_COMPLETION_PERMISSION = 1
1364
+ private const val LIST_CHILD_PERMISSION = 2
1365
+ private const val LIST_CANCELLATION_PERMISSION = 4
1359
1366
1360
1367
private class Empty (override val isActive : Boolean ) : Incomplete {
1361
1368
override val list: NodeList ? get() = null
0 commit comments