//===----------------------------------------------------------------------===// // // This source file is part of the Swift Atomics open source project // // Copyright (c) 2024 Apple Inc. and the Swift project authors // Licensed under Apache License v2.0 with Runtime Library Exception // // See https://swift.org/LICENSE.txt for license information // See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors // //===----------------------------------------------------------------------===// import Glibc @available(SwiftStdlib 6.0, *) @frozen @_staticExclusiveOnly public struct _MutexHandle: ~Copyable { @usableFromInline let value: _Cell @available(SwiftStdlib 6.0, *) @_alwaysEmitIntoClient @_transparent public init() { value = _Cell(umutex()) } @available(SwiftStdlib 6.0, *) @_alwaysEmitIntoClient @_transparent internal borrowing func _lock() { _umtx_op(value._address, UMTX_OP_MUTEX_LOCK, 0, nil, nil) } @available(SwiftStdlib 6.0, *) @_alwaysEmitIntoClient @_transparent internal borrowing func _tryLock() -> Bool { _umtx_op(value._address, UMTX_OP_MUTEX_TRYLOCK, 0, nil, nil) != -1 } @available(SwiftStdlib 6.0, *) @_alwaysEmitIntoClient @_transparent internal borrowing func _unlock() { _umtx_op(value._address, UMTX_OP_MUTEX_UNLOCK, 0, nil, nil) } }