@@ -352,7 +352,7 @@ public open class JobSupport constructor(active: Boolean) : Job, ChildJob, Paren
352
352
}
353
353
354
354
private fun NodeList.notifyCompletion (cause : Throwable ? ) {
355
- close(LIST_MAX_PERMISSION )
355
+ close(LIST_ON_COMPLETION_PERMISSION )
356
356
notifyHandlers(this , cause) { true }
357
357
}
358
358
@@ -468,13 +468,13 @@ public open class JobSupport constructor(active: Boolean) : Job, ChildJob, Paren
468
468
if (node.onCancelling) {
469
469
val rootCause = (state as ? Finishing )?.let { synchronized(it) { it.rootCause } }
470
470
if (rootCause == null ) {
471
- list.addLast(node, LIST_CANCELLATION_PERMISSION )
471
+ list.addLast(node, LIST_CANCELLATION_PERMISSION or LIST_ON_COMPLETION_PERMISSION )
472
472
} else {
473
473
if (invokeImmediately) node.invoke(rootCause)
474
474
return NonDisposableHandle
475
475
}
476
476
} else {
477
- list.addLast(node, LIST_MAX_PERMISSION )
477
+ list.addLast(node, LIST_ON_COMPLETION_PERMISSION )
478
478
}
479
479
}
480
480
when {
@@ -978,14 +978,20 @@ public open class JobSupport constructor(active: Boolean) : Job, ChildJob, Paren
978
978
val node = ChildHandleNode (child).also { it.job = this }
979
979
val added = tryPutNodeIntoList(node) { _, list ->
980
980
// First, try to add a child along the cancellation handlers
981
- val addedBeforeCancellation = list.addLast(node, LIST_CANCELLATION_PERMISSION )
981
+ val addedBeforeCancellation = list.addLast(
982
+ node,
983
+ LIST_ON_COMPLETION_PERMISSION or LIST_CHILD_PERMISSION or LIST_CANCELLATION_PERMISSION
984
+ )
982
985
if (addedBeforeCancellation) {
983
986
// The child managed to be added before the parent started to cancel or complete. Success.
984
987
true
985
988
} else {
986
989
// Either cancellation or completion already happened, the child was not added.
987
990
// Now we need to try adding it for completion.
988
- val addedBeforeCompletion = list.addLast(node, LIST_CHILD_PERMISSION )
991
+ val addedBeforeCompletion = list.addLast(
992
+ node,
993
+ LIST_CHILD_PERMISSION or LIST_ON_COMPLETION_PERMISSION
994
+ )
989
995
// Whether or not we managed to add the child before the parent completed, we need to investigate:
990
996
// why didn't we manage to add it before cancellation?
991
997
// If it's because cancellation happened in the meantime, we need to notify the child.
@@ -1345,9 +1351,10 @@ private val SEALED = Symbol("SEALED")
1345
1351
private val EMPTY_NEW = Empty (false )
1346
1352
private val EMPTY_ACTIVE = Empty (true )
1347
1353
1348
- private const val LIST_MAX_PERMISSION = Int .MAX_VALUE
1349
- private const val LIST_CHILD_PERMISSION = 1
1350
- private const val LIST_CANCELLATION_PERMISSION = 0
1354
+ // bit mask
1355
+ private const val LIST_ON_COMPLETION_PERMISSION = 1
1356
+ private const val LIST_CHILD_PERMISSION = 2
1357
+ private const val LIST_CANCELLATION_PERMISSION = 4
1351
1358
1352
1359
private class Empty (override val isActive : Boolean ) : Incomplete {
1353
1360
override val list: NodeList ? get() = null
0 commit comments