Skip to content

Data races on SelectImplementation.clauses and SelectImplementation.internalResult #3843

@chaoren

Description

@chaoren

Our internal TSan tests found the following data race.

Details
==================
WARNING: ThreadSanitizer: data race (pid=416)
  Write of size 4 at 0x0000d6b50bd8 by thread T4 (mutexes: write M0, write M1):
    #0 kotlinx.coroutines.selects.SelectImplementation.invoke(Ljava/lang/Throwable;)V Select.kt:754 
    #1 kotlinx.coroutines.CancellableContinuationImpl.callCancelHandler(Lkotlinx/coroutines/CancelHandler;Ljava/lang/Throwable;)V CancellableContinuationImpl.kt:249 
    #2 kotlinx.coroutines.CancellableContinuationImpl.cancel(Ljava/lang/Throwable;)Z CancellableContinuationImpl.kt:212 
    #3 kotlinx.coroutines.CancellableContinuationImpl.parentCancelled$kotlinx_coroutines_core(Ljava/lang/Throwable;)V CancellableContinuationImpl.kt:224 
    #4 kotlinx.coroutines.ChildContinuation.invoke(Ljava/lang/Throwable;)V JobSupport.kt:1450 
    #5 kotlinx.coroutines.JobSupport.notifyCancelling(Lkotlinx/coroutines/NodeList;Ljava/lang/Throwable;)V JobSupport.kt:1479 
    #6 kotlinx.coroutines.JobSupport.tryMakeCancelling(Lkotlinx/coroutines/Incomplete;Ljava/lang/Throwable;)Z JobSupport.kt:799 
    #7 kotlinx.coroutines.JobSupport.makeCancelling(Ljava/lang/Object;)Ljava/lang/Object; JobSupport.kt:759 
    #8 kotlinx.coroutines.JobSupport.cancelImpl$kotlinx_coroutines_core(Ljava/lang/Object;)Z JobSupport.kt:675 
    #9 kotlinx.coroutines.JobSupport.cancelInternal(Ljava/lang/Throwable;)V JobSupport.kt:636 
    #10 kotlinx.coroutines.JobSupport.cancel(Ljava/util/concurrent/CancellationException;)V JobSupport.kt:621 
    #11 kotlinx.coroutines.Job$DefaultImpls.cancel$default(Lkotlinx/coroutines/Job;Ljava/util/concurrent/CancellationException;ILjava/lang/Object;)V Job.kt:199 
    #12 kotlinx.coroutines.JobKt__JobKt.cancelAndJoin(Lkotlinx/coroutines/Job;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; Job.kt:511 
    #13 kotlinx.coroutines.JobKt.cancelAndJoin(Lkotlinx/coroutines/Job;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; ??:1 
    #14 kotlinx.coroutines.sync.MutexStressTest$stressUnlockCancelRaceWithSelect$1.invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; MutexStressTest.kt:113 
    #15 kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(Ljava/lang/Object;)V ContinuationImpl.kt:33 
    #16 kotlinx.coroutines.DispatchedTask.run()V DispatchedTask.kt:108 
    #17 kotlinx.coroutines.EventLoopImplBase.processNextEvent()J EventLoop.common.kt:280 
    #18 kotlinx.coroutines.BlockingCoroutine.joinBlocking()Ljava/lang/Object; Builders.kt:85 
    #19 kotlinx.coroutines.BuildersKt__BuildersKt.runBlocking(Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;)Ljava/lang/Object; Builders.kt:59 
    #20 kotlinx.coroutines.BuildersKt.runBlocking(Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;)Ljava/lang/Object; ??:1 
    #21 kotlinx.coroutines.TestBase.runTest(Lkotlin/jvm/functions/Function1;Ljava/util/List;Lkotlin/jvm/functions/Function2;)V TestBase.kt:224 
    #22 kotlinx.coroutines.TestBase.runTest$default(Lkotlinx/coroutines/TestBase;Lkotlin/jvm/functions/Function1;Ljava/util/List;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)V TestBase.kt:216 
    #23 kotlinx.coroutines.sync.MutexStressTest.stressUnlockCancelRaceWithSelect()V MutexStressTest.kt:89 

  Previous read of size 4 at 0x0000d6b50bd8 by thread T85:
    #0 kotlinx.coroutines.selects.SelectImplementation.findClause(Ljava/lang/Object;)Lkotlinx/coroutines/selects/SelectImplementation$ClauseData; Select.kt:656 
    #1 kotlinx.coroutines.selects.SelectImplementation.trySelectInternal(Ljava/lang/Object;Ljava/lang/Object;)I Select.kt:615 
    #2 kotlinx.coroutines.selects.SelectImplementation.trySelect(Ljava/lang/Object;Ljava/lang/Object;)Z Select.kt:600 
    #3 kotlinx.coroutines.sync.MutexImpl$SelectInstanceWithOwner.trySelect(Ljava/lang/Object;Ljava/lang/Object;)Z Mutex.kt:285 
    #4 kotlinx.coroutines.sync.SemaphoreImpl.tryResumeAcquire(Ljava/lang/Object;)Z Semaphore.kt:354 
    #5 kotlinx.coroutines.sync.SemaphoreImpl.tryResumeNextFromQueue()Z Semaphore.kt:340 
    #6 kotlinx.coroutines.sync.SemaphoreImpl.release()V Semaphore.kt:265 
    #7 kotlinx.coroutines.sync.MutexImpl.unlock(Ljava/lang/Object;)V Mutex.kt:222 
    #8 kotlinx.coroutines.sync.Mutex$DefaultImpls.unlock$default(Lkotlinx/coroutines/sync/Mutex;Ljava/lang/Object;ILjava/lang/Object;)V Mutex.kt:98 
    #9 kotlinx.coroutines.sync.MutexStressTest$stressUnlockCancelRaceWithSelect$1$1$1$job2$1.invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; MutexStressTest.kt:109 

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions