Skip to content

waitForStatusRecordUnlockIfNotSelfLocked deadlocks on macOS 14.0 #67110

Open
@eaigner

Description

@eaigner

Description

waitForStatusRecordUnlockIfNotSelfLocked deadlocks on macOS 14.0 beta 2. There must have been some changes to libswiftConcurrency in Sonoma, since it does (obviously) not occur on 13.4.1 (22F82).

I have tested this with my own code as well as with Apples AsyncChannel implementation

Steps to reproduce

The exact condition is unknown, but sometimes CheckedContinuation.resume(...) does not return and keeps spinning, thus locking up the application. As for the AsyncChannel package, it deadlocks here

Expected behavior

CheckedContinuation.resume(...) should return immediately, as guaranteed.

Environment

  • Swift compiler version info

    swift-driver version: 1.75.2 Apple Swift version 5.8.1 (swiftlang-5.8.0.124.5 clang-1403.0.22.11.100)
    Target: arm64-apple-macosx14.0

  • Xcode version info

    Version 15.0 beta (15A5160n)

  • Deployment target:

    14.0 Beta (23A5276g)

Here is a stacktracke I recorded

(lldb) bt
* thread #23, queue = 'com.apple.root.user-initiated-qos.cooperative'
    frame #0: 0x000000018504c66c libsystem_kernel.dylib`__ulock_wait + 8
    frame #1: 0x00000001850b770c libsystem_platform.dylib`_os_unfair_lock_lock_slow + 208
    frame #2: 0x00000001086482fc libclang_rt.tsan_osx_dynamic.dylib`wrap_os_unfair_lock_lock + 188
    frame #3: 0x000000022104c3c0 libswift_Concurrency.dylib`waitForStatusRecordUnlockIfNotSelfLocked(swift::AsyncTask*, swift::ActiveTaskStatus&) + 184
    frame #4: 0x000000022104c7c4 libswift_Concurrency.dylib`withStatusRecordLock(swift::AsyncTask*, swift::ActiveTaskStatus, __swift::__runtime::llvm::function_ref<void (swift::ActiveTaskStatus)>, __swift::__runtime::llvm::function_ref<void (swift::ActiveTaskStatus, swift::ActiveTaskStatus&)>) + 84
    frame #5: 0x000000022104ca4c libswift_Concurrency.dylib`swift::updateStatusRecord(swift::AsyncTask*, swift::TaskStatusRecord*, __swift::__runtime::llvm::function_ref<void ()>, swift::ActiveTaskStatus&, __swift::__runtime::llvm::function_ref<void (swift::ActiveTaskStatus, swift::ActiveTaskStatus&)>) + 56
    frame #6: 0x0000000221045ed4 libswift_Concurrency.dylib`swift::AsyncTask::flagAsAndEnqueueOnExecutor(swift::ExecutorRef) + 128
    frame #7: 0x000000022104b284 libswift_Concurrency.dylib`resumeTaskAfterContinuation(swift::AsyncTask*, swift::ContinuationAsyncContext*) + 192
    frame #8: 0x0000000221049a88 libswift_Concurrency.dylib`swift_continuation_throwingResumeImpl(swift::AsyncTask*) + 244
    frame #9: 0x0000000105a93194 MYAPP`UnsafeContinuation.resume(returning:) at <compiler-generated>:0
    frame #10: 0x0000000105a8ec28 MYAPP`UnsafeContinuation.resume<>() at <compiler-generated>:0
  * frame #11: 0x0000000105abb264 MYAPP`closure #1 in ChannelStorage.next(stateMachine=AsyncAlgorithms.ChannelStateMachine<Git.FormatParser.ParsedLine, Swift.Never> @ 0x00000001323381e0) at ChannelStorage.swift:104:33
    frame #12: 0x0000000105abb3dc MYAPP`partial apply for closure #1 in ChannelStorage.next() at <compiler-generated>:0
    frame #13: 0x0000000105b325a4 MYAPP`closure #1 in ManagedCriticalState.withCriticalRegion<τ_0_0>(header=0x1323381e0, lock=0x132338210, critical=0x105abb384) at Locking.swift:136:18
    frame #14: 0x0000000105b32690 MYAPP`partial apply for closure #1 in ManagedCriticalState.withCriticalRegion<τ_0_0>(_:) at <compiler-generated>:0
    frame #15: 0x0000000194f7019c libswiftCore.dylib`Swift.ManagedBuffer.withUnsafeMutablePointers<τ_0_0>((Swift.UnsafeMutablePointer<τ_0_0>, Swift.UnsafeMutablePointer<τ_0_1>) throws -> τ_1_0) throws -> τ_1_0 + 180
    frame #16: 0x0000000105b3243c MYAPP`ManagedCriticalState.withCriticalRegion<τ_0_0>(critical=0x105abb384, self=AsyncAlgorithms.ManagedCriticalState<AsyncAlgorithms.ChannelStateMachine<Git.FormatParser.ParsedLine, Swift.Never>> @ 0x000000016bacab68) at Locking.swift:133:16
    frame #17: 0x0000000105ab9fac MYAPP`ChannelStorage.next(self=AsyncAlgorithms.ChannelStorage<Git.FormatParser.ParsedLine, Swift.Never> @ 0x00000001394f4c40) at ChannelStorage.swift:97:50
    frame #18: 0x0000000105aa5940 MYAPP`AsyncChannel.Iterator.next(self=AsyncAlgorithms.AsyncChannel<Git.FormatParser.ParsedLine>.Iterator @ 0x0000000137710870) at AsyncChannel.swift:57
    frame #19: 0x00000001056bb070 MYAPP`closure #1 in closure #1 in GitCommand.log(entries=0x00000001341c5160, lines=0x0000000138f0fd20) at GitCommand+Log.swift:21
    frame #20: 0x00000001056c0484 MYAPP`partial apply for closure #1 in closure #1 in GitCommand.log(order:query:arguments:entries:) at <compiler-generated>:0

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugA deviation from expected or documented behavior. Also: expected but undesirable behavior.triage neededThis issue needs more specific labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions