diff --git a/Sources/Foundation/NSLock.swift b/Sources/Foundation/NSLock.swift index fe1d08b775..6e953c0ad8 100644 --- a/Sources/Foundation/NSLock.swift +++ b/Sources/Foundation/NSLock.swift @@ -50,24 +50,37 @@ private typealias _ConditionVariablePointer = UnsafeMutablePointer Void = {} - private var _thread: _swift_CFThreadRef? = nil + private var __thread: Any? = nil + + private var _thread: _swift_CFThreadRef? { + get { + __thread as! _swift_CFThreadRef? + } + set { + __thread = newValue + } + } #if os(Windows) && !CYGWIN private class NonexportedAttrStorage { - var value = _CFThreadAttributes(dwSizeOfAttributes: DWORD(MemoryLayout<_CFThreadAttributes>.size), + var value: Any = _CFThreadAttributes(dwSizeOfAttributes: DWORD(MemoryLayout<_CFThreadAttributes>.size), dwThreadStackReservation: 0) } private let _attrStorage = NonexportedAttrStorage() internal final var _attr: _CFThreadAttributes { - get { _attrStorage.value } + get { _attrStorage.value as! _CFThreadAttributes } set { _attrStorage.value = newValue } } #elseif CYGWIN || os(OpenBSD) - internal var _attr : pthread_attr_t? = nil + internal var __attr : Any? = nil + + internal var _attr: pthread_attr_t? { + get { + __attr as! pthread_attr_t? + } + set { + __attr = newValue + } + } #else - internal var _attr = pthread_attr_t() + internal var __attr : Any = pthread_attr_t() + + internal var _attr: pthread_attr_t { + get { + __attr as! pthread_attr_t + } + set { + __attr = newValue + } + } #endif internal var _status = _NSThreadStatus.initialized internal var _cancelled = false @@ -239,16 +266,22 @@ open class Thread : NSObject { internal init(thread: _swift_CFThreadRef) { // Note: even on Darwin this is a non-optional _CFThreadRef; this is only used for valid threads, which are never null pointers. - _thread = thread + __thread = thread } public override init() { #if !os(Windows) - let _ = withUnsafeMutablePointer(to: &_attr) { attr in + #if os(OpenBSD) + var attr: pthread_attr_t? = nil + #else + var attr = pthread_attr_t() + #endif + let _ = withUnsafeMutablePointer(to: &attr) { attr in pthread_attr_init(attr) pthread_attr_setscope(attr, Int32(PTHREAD_SCOPE_SYSTEM)) pthread_attr_setdetachstate(attr, Int32(PTHREAD_CREATE_DETACHED)) } + __attr = attr #endif }