Skip to content

Commit b2beac6

Browse files
committed
New select and Mutex algorithms
1 parent 41b88af commit b2beac6

38 files changed

+1939
-1627
lines changed

gradle.properties

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ junit5_version=5.7.0
1313
atomicfu_version=0.17.0
1414
knit_version=0.3.0
1515
html_version=0.7.2
16-
lincheck_version=2.14
16+
lincheck_version=2.14.1
1717
dokka_version=1.6.0-dev-138
1818
byte_buddy_version=1.10.9
1919
reactor_version=3.4.1

kotlinx-coroutines-core/api/kotlinx-coroutines-core.api

+94-40
Original file line numberDiff line numberDiff line change
@@ -410,7 +410,7 @@ public final class kotlinx/coroutines/JobKt {
410410
public static final fun isActive (Lkotlin/coroutines/CoroutineContext;)Z
411411
}
412412

413-
public class kotlinx/coroutines/JobSupport : kotlinx/coroutines/ChildJob, kotlinx/coroutines/Job, kotlinx/coroutines/ParentJob, kotlinx/coroutines/selects/SelectClause0 {
413+
public class kotlinx/coroutines/JobSupport : kotlinx/coroutines/ChildJob, kotlinx/coroutines/Job, kotlinx/coroutines/ParentJob {
414414
public fun <init> (Z)V
415415
protected fun afterCompletion (Ljava/lang/Object;)V
416416
public final fun attachChild (Lkotlinx/coroutines/ChildJob;)Lkotlinx/coroutines/ChildHandle;
@@ -448,7 +448,6 @@ public class kotlinx/coroutines/JobSupport : kotlinx/coroutines/ChildJob, kotlin
448448
public final fun parentCancelled (Lkotlinx/coroutines/ParentJob;)V
449449
public fun plus (Lkotlin/coroutines/CoroutineContext;)Lkotlin/coroutines/CoroutineContext;
450450
public fun plus (Lkotlinx/coroutines/Job;)Lkotlinx/coroutines/Job;
451-
public final fun registerSelectClause0 (Lkotlinx/coroutines/selects/SelectInstance;Lkotlin/jvm/functions/Function1;)V
452451
public final fun start ()Z
453452
protected final fun toCancellationException (Ljava/lang/Throwable;Ljava/lang/String;)Ljava/util/concurrent/CancellationException;
454453
public static synthetic fun toCancellationException$default (Lkotlinx/coroutines/JobSupport;Ljava/lang/Throwable;Ljava/lang/String;ILjava/lang/Object;)Ljava/util/concurrent/CancellationException;
@@ -1178,83 +1177,138 @@ public class kotlinx/coroutines/scheduling/ExperimentalCoroutineDispatcher : kot
11781177
public fun toString ()Ljava/lang/String;
11791178
}
11801179

1180+
public final class kotlinx/coroutines/selects/OnTimeoutKt {
1181+
public static final fun onTimeout (Lkotlinx/coroutines/selects/SelectBuilder;JLkotlin/jvm/functions/Function1;)V
1182+
public static final fun onTimeout-8Mi8wO0 (Lkotlinx/coroutines/selects/SelectBuilder;JLkotlin/jvm/functions/Function1;)V
1183+
}
1184+
11811185
public abstract interface class kotlinx/coroutines/selects/SelectBuilder {
11821186
public abstract fun invoke (Lkotlinx/coroutines/selects/SelectClause0;Lkotlin/jvm/functions/Function1;)V
11831187
public abstract fun invoke (Lkotlinx/coroutines/selects/SelectClause1;Lkotlin/jvm/functions/Function2;)V
11841188
public abstract fun invoke (Lkotlinx/coroutines/selects/SelectClause2;Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)V
11851189
public abstract fun invoke (Lkotlinx/coroutines/selects/SelectClause2;Lkotlin/jvm/functions/Function2;)V
1186-
public abstract fun onTimeout (JLkotlin/jvm/functions/Function1;)V
1190+
public abstract synthetic fun onTimeout (JLkotlin/jvm/functions/Function1;)V
11871191
}
11881192

11891193
public final class kotlinx/coroutines/selects/SelectBuilder$DefaultImpls {
11901194
public static fun invoke (Lkotlinx/coroutines/selects/SelectBuilder;Lkotlinx/coroutines/selects/SelectClause2;Lkotlin/jvm/functions/Function2;)V
1195+
public static synthetic fun onTimeout (Lkotlinx/coroutines/selects/SelectBuilder;JLkotlin/jvm/functions/Function1;)V
11911196
}
11921197

1193-
public final class kotlinx/coroutines/selects/SelectBuilderImpl : kotlinx/coroutines/internal/LockFreeLinkedListHead, kotlin/coroutines/Continuation, kotlin/coroutines/jvm/internal/CoroutineStackFrame, kotlinx/coroutines/selects/SelectBuilder, kotlinx/coroutines/selects/SelectInstance {
1198+
public final class kotlinx/coroutines/selects/SelectBuilderImpl : kotlinx/coroutines/selects/SelectImplementation {
11941199
public fun <init> (Lkotlin/coroutines/Continuation;)V
1195-
public fun disposeOnSelect (Lkotlinx/coroutines/DisposableHandle;)V
1196-
public fun getCallerFrame ()Lkotlin/coroutines/jvm/internal/CoroutineStackFrame;
1197-
public fun getCompletion ()Lkotlin/coroutines/Continuation;
1198-
public fun getContext ()Lkotlin/coroutines/CoroutineContext;
11991200
public final fun getResult ()Ljava/lang/Object;
1200-
public fun getStackTraceElement ()Ljava/lang/StackTraceElement;
1201+
public final fun getUCont ()Lkotlin/coroutines/Continuation;
12011202
public final fun handleBuilderException (Ljava/lang/Throwable;)V
1202-
public fun invoke (Lkotlinx/coroutines/selects/SelectClause0;Lkotlin/jvm/functions/Function1;)V
1203-
public fun invoke (Lkotlinx/coroutines/selects/SelectClause1;Lkotlin/jvm/functions/Function2;)V
1204-
public fun invoke (Lkotlinx/coroutines/selects/SelectClause2;Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)V
1205-
public fun invoke (Lkotlinx/coroutines/selects/SelectClause2;Lkotlin/jvm/functions/Function2;)V
1206-
public fun isSelected ()Z
1207-
public fun onTimeout (JLkotlin/jvm/functions/Function1;)V
1208-
public fun performAtomicTrySelect (Lkotlinx/coroutines/internal/AtomicDesc;)Ljava/lang/Object;
1209-
public fun resumeSelectWithException (Ljava/lang/Throwable;)V
1210-
public fun resumeWith (Ljava/lang/Object;)V
1211-
public fun toString ()Ljava/lang/String;
1212-
public fun trySelect ()Z
1213-
public fun trySelectOther (Lkotlinx/coroutines/internal/LockFreeLinkedListNode$PrepareOp;)Ljava/lang/Object;
12141203
}
12151204

1216-
public abstract interface class kotlinx/coroutines/selects/SelectClause0 {
1217-
public abstract fun registerSelectClause0 (Lkotlinx/coroutines/selects/SelectInstance;Lkotlin/jvm/functions/Function1;)V
1205+
public abstract interface class kotlinx/coroutines/selects/SelectClause {
1206+
public abstract fun getClauseObject ()Ljava/lang/Object;
1207+
public abstract fun getOnCancellationConstructor ()Lkotlin/jvm/functions/Function3;
1208+
public abstract fun getProcessResFunc ()Lkotlin/jvm/functions/Function3;
1209+
public abstract fun getRegFunc ()Lkotlin/jvm/functions/Function3;
1210+
}
1211+
1212+
public abstract interface class kotlinx/coroutines/selects/SelectClause0 : kotlinx/coroutines/selects/SelectClause {
1213+
}
1214+
1215+
public final class kotlinx/coroutines/selects/SelectClause0Impl : kotlinx/coroutines/selects/SelectClause0 {
1216+
public fun <init> (Ljava/lang/Object;Lkotlin/jvm/functions/Function3;Lkotlin/jvm/functions/Function3;)V
1217+
public synthetic fun <init> (Ljava/lang/Object;Lkotlin/jvm/functions/Function3;Lkotlin/jvm/functions/Function3;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
1218+
public fun getClauseObject ()Ljava/lang/Object;
1219+
public fun getOnCancellationConstructor ()Lkotlin/jvm/functions/Function3;
1220+
public fun getProcessResFunc ()Lkotlin/jvm/functions/Function3;
1221+
public fun getRegFunc ()Lkotlin/jvm/functions/Function3;
12181222
}
12191223

1220-
public abstract interface class kotlinx/coroutines/selects/SelectClause1 {
1221-
public abstract fun registerSelectClause1 (Lkotlinx/coroutines/selects/SelectInstance;Lkotlin/jvm/functions/Function2;)V
1224+
public abstract interface class kotlinx/coroutines/selects/SelectClause1 : kotlinx/coroutines/selects/SelectClause {
12221225
}
12231226

1224-
public abstract interface class kotlinx/coroutines/selects/SelectClause2 {
1225-
public abstract fun registerSelectClause2 (Lkotlinx/coroutines/selects/SelectInstance;Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)V
1227+
public final class kotlinx/coroutines/selects/SelectClause1Impl : kotlinx/coroutines/selects/SelectClause1 {
1228+
public fun <init> (Ljava/lang/Object;Lkotlin/jvm/functions/Function3;Lkotlin/jvm/functions/Function3;Lkotlin/jvm/functions/Function3;)V
1229+
public synthetic fun <init> (Ljava/lang/Object;Lkotlin/jvm/functions/Function3;Lkotlin/jvm/functions/Function3;Lkotlin/jvm/functions/Function3;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
1230+
public fun getClauseObject ()Ljava/lang/Object;
1231+
public fun getOnCancellationConstructor ()Lkotlin/jvm/functions/Function3;
1232+
public fun getProcessResFunc ()Lkotlin/jvm/functions/Function3;
1233+
public fun getRegFunc ()Lkotlin/jvm/functions/Function3;
1234+
}
1235+
1236+
public abstract interface class kotlinx/coroutines/selects/SelectClause2 : kotlinx/coroutines/selects/SelectClause {
1237+
}
1238+
1239+
public final class kotlinx/coroutines/selects/SelectClause2Impl : kotlinx/coroutines/selects/SelectClause2 {
1240+
public fun <init> (Ljava/lang/Object;Lkotlin/jvm/functions/Function3;Lkotlin/jvm/functions/Function3;Lkotlin/jvm/functions/Function3;)V
1241+
public synthetic fun <init> (Ljava/lang/Object;Lkotlin/jvm/functions/Function3;Lkotlin/jvm/functions/Function3;Lkotlin/jvm/functions/Function3;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
1242+
public fun getClauseObject ()Ljava/lang/Object;
1243+
public fun getOnCancellationConstructor ()Lkotlin/jvm/functions/Function3;
1244+
public fun getProcessResFunc ()Lkotlin/jvm/functions/Function3;
1245+
public fun getRegFunc ()Lkotlin/jvm/functions/Function3;
1246+
}
1247+
1248+
public class kotlinx/coroutines/selects/SelectImplementation : kotlinx/coroutines/selects/SelectBuilder, kotlinx/coroutines/selects/SelectInstance {
1249+
public fun <init> (Lkotlin/coroutines/CoroutineContext;)V
1250+
public fun disposeOnCompletion (Lkotlinx/coroutines/DisposableHandle;)V
1251+
public fun doSelect (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
1252+
public fun getContext ()Lkotlin/coroutines/CoroutineContext;
1253+
public synthetic fun invoke (Ljava/lang/Object;)Ljava/lang/Object;
1254+
public fun invoke (Ljava/lang/Throwable;)V
1255+
public fun invoke (Lkotlinx/coroutines/selects/SelectClause0;Lkotlin/jvm/functions/Function1;)V
1256+
public fun invoke (Lkotlinx/coroutines/selects/SelectClause1;Lkotlin/jvm/functions/Function2;)V
1257+
public fun invoke (Lkotlinx/coroutines/selects/SelectClause2;Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)V
1258+
public fun invoke (Lkotlinx/coroutines/selects/SelectClause2;Lkotlin/jvm/functions/Function2;)V
1259+
public synthetic fun onTimeout (JLkotlin/jvm/functions/Function1;)V
1260+
protected final fun register (Lkotlinx/coroutines/selects/SelectImplementation$ClauseData;Z)V
1261+
public static synthetic fun register$default (Lkotlinx/coroutines/selects/SelectImplementation;Lkotlinx/coroutines/selects/SelectImplementation$ClauseData;ZILjava/lang/Object;)V
1262+
public fun selectInRegistrationPhase (Ljava/lang/Object;)V
1263+
public fun trySelect (Ljava/lang/Object;Ljava/lang/Object;Lkotlin/jvm/functions/Function1;)Z
1264+
public final fun trySelectDetailed (Ljava/lang/Object;Ljava/lang/Object;Lkotlin/jvm/functions/Function1;)Lkotlinx/coroutines/selects/TrySelectDetailedResult;
1265+
public static synthetic fun trySelectDetailed$default (Lkotlinx/coroutines/selects/SelectImplementation;Ljava/lang/Object;Ljava/lang/Object;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lkotlinx/coroutines/selects/TrySelectDetailedResult;
1266+
}
1267+
1268+
protected final class kotlinx/coroutines/selects/SelectImplementation$ClauseData {
1269+
public final field clauseObject Ljava/lang/Object;
1270+
public field disposableHandle Lkotlinx/coroutines/DisposableHandle;
1271+
public final field onCancellationConstructor Lkotlin/jvm/functions/Function3;
1272+
public fun <init> (Ljava/lang/Object;Lkotlin/jvm/functions/Function3;Lkotlin/jvm/functions/Function3;Ljava/lang/Object;Ljava/lang/Object;Lkotlin/jvm/functions/Function3;Lkotlinx/coroutines/DisposableHandle;)V
1273+
public synthetic fun <init> (Ljava/lang/Object;Lkotlin/jvm/functions/Function3;Lkotlin/jvm/functions/Function3;Ljava/lang/Object;Ljava/lang/Object;Lkotlin/jvm/functions/Function3;Lkotlinx/coroutines/DisposableHandle;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
1274+
public final fun createOnCancellationAction (Lkotlinx/coroutines/selects/SelectInstance;Ljava/lang/Object;)Lkotlin/jvm/functions/Function1;
1275+
public final fun invokeBlock (Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
1276+
public final fun processResult (Ljava/lang/Object;)Ljava/lang/Object;
1277+
public final fun tryRegister (Lkotlinx/coroutines/selects/SelectImplementation;)Z
12261278
}
12271279

12281280
public abstract interface class kotlinx/coroutines/selects/SelectInstance {
1229-
public abstract fun disposeOnSelect (Lkotlinx/coroutines/DisposableHandle;)V
1230-
public abstract fun getCompletion ()Lkotlin/coroutines/Continuation;
1231-
public abstract fun isSelected ()Z
1232-
public abstract fun performAtomicTrySelect (Lkotlinx/coroutines/internal/AtomicDesc;)Ljava/lang/Object;
1233-
public abstract fun resumeSelectWithException (Ljava/lang/Throwable;)V
1234-
public abstract fun trySelect ()Z
1235-
public abstract fun trySelectOther (Lkotlinx/coroutines/internal/LockFreeLinkedListNode$PrepareOp;)Ljava/lang/Object;
1281+
public abstract fun disposeOnCompletion (Lkotlinx/coroutines/DisposableHandle;)V
1282+
public abstract fun getContext ()Lkotlin/coroutines/CoroutineContext;
1283+
public abstract fun selectInRegistrationPhase (Ljava/lang/Object;)V
1284+
public abstract fun trySelect (Ljava/lang/Object;Ljava/lang/Object;Lkotlin/jvm/functions/Function1;)Z
1285+
}
1286+
1287+
public final class kotlinx/coroutines/selects/SelectInstance$DefaultImpls {
1288+
public static synthetic fun trySelect$default (Lkotlinx/coroutines/selects/SelectInstance;Ljava/lang/Object;Ljava/lang/Object;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Z
12361289
}
12371290

12381291
public final class kotlinx/coroutines/selects/SelectKt {
1239-
public static final fun onTimeout-8Mi8wO0 (Lkotlinx/coroutines/selects/SelectBuilder;JLkotlin/jvm/functions/Function1;)V
12401292
public static final fun select (Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
12411293
}
12421294

12431295
public final class kotlinx/coroutines/selects/SelectUnbiasedKt {
12441296
public static final fun selectUnbiased (Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
12451297
}
12461298

1247-
public final class kotlinx/coroutines/selects/UnbiasedSelectBuilderImpl : kotlinx/coroutines/selects/SelectBuilder {
1299+
public final class kotlinx/coroutines/selects/UnbiasedSelectBuilderImpl : kotlinx/coroutines/selects/UnbiasedSelectImplementation {
12481300
public fun <init> (Lkotlin/coroutines/Continuation;)V
1249-
public final fun getClauses ()Ljava/util/ArrayList;
1250-
public final fun getInstance ()Lkotlinx/coroutines/selects/SelectBuilderImpl;
1301+
public final fun getUCont ()Lkotlin/coroutines/Continuation;
12511302
public final fun handleBuilderException (Ljava/lang/Throwable;)V
12521303
public final fun initSelectResult ()Ljava/lang/Object;
1304+
}
1305+
1306+
public class kotlinx/coroutines/selects/UnbiasedSelectImplementation : kotlinx/coroutines/selects/SelectImplementation {
1307+
public fun <init> (Lkotlin/coroutines/CoroutineContext;)V
1308+
public fun doSelect (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
12531309
public fun invoke (Lkotlinx/coroutines/selects/SelectClause0;Lkotlin/jvm/functions/Function1;)V
12541310
public fun invoke (Lkotlinx/coroutines/selects/SelectClause1;Lkotlin/jvm/functions/Function2;)V
12551311
public fun invoke (Lkotlinx/coroutines/selects/SelectClause2;Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)V
1256-
public fun invoke (Lkotlinx/coroutines/selects/SelectClause2;Lkotlin/jvm/functions/Function2;)V
1257-
public fun onTimeout (JLkotlin/jvm/functions/Function1;)V
12581312
}
12591313

12601314
public final class kotlinx/coroutines/selects/WhileSelectKt {

kotlinx-coroutines-core/common/src/Builders.common.kt

+2-4
Original file line numberDiff line numberDiff line change
@@ -96,12 +96,10 @@ public fun <T> CoroutineScope.async(
9696
private open class DeferredCoroutine<T>(
9797
parentContext: CoroutineContext,
9898
active: Boolean
99-
) : AbstractCoroutine<T>(parentContext, true, active = active), Deferred<T>, SelectClause1<T> {
99+
) : AbstractCoroutine<T>(parentContext, true, active = active), Deferred<T> {
100100
override fun getCompleted(): T = getCompletedInternal() as T
101101
override suspend fun await(): T = awaitInternal() as T
102-
override val onAwait: SelectClause1<T> get() = this
103-
override fun <R> registerSelectClause1(select: SelectInstance<R>, block: suspend (T) -> R) =
104-
registerSelectClause1Internal(select, block)
102+
override val onAwait: SelectClause1<T> get() = onAwaitInternal as SelectClause1<T>
105103
}
106104

107105
private class LazyDeferredCoroutine<T>(

kotlinx-coroutines-core/common/src/CompletableDeferred.kt

+2-4
Original file line numberDiff line numberDiff line change
@@ -79,14 +79,12 @@ public fun <T> CompletableDeferred(value: T): CompletableDeferred<T> = Completab
7979
@Suppress("UNCHECKED_CAST")
8080
private class CompletableDeferredImpl<T>(
8181
parent: Job?
82-
) : JobSupport(true), CompletableDeferred<T>, SelectClause1<T> {
82+
) : JobSupport(true), CompletableDeferred<T> {
8383
init { initParentJob(parent) }
8484
override val onCancelComplete get() = true
8585
override fun getCompleted(): T = getCompletedInternal() as T
8686
override suspend fun await(): T = awaitInternal() as T
87-
override val onAwait: SelectClause1<T> get() = this
88-
override fun <R> registerSelectClause1(select: SelectInstance<R>, block: suspend (T) -> R) =
89-
registerSelectClause1Internal(select, block)
87+
override val onAwait: SelectClause1<T> get() = onAwaitInternal as SelectClause1<T>
9088

9189
override fun complete(value: T): Boolean =
9290
makeCompleting(value)

0 commit comments

Comments
 (0)