No Description

Platform.Darwin.swift 2.1KB

    // // Platform.Darwin.swift // Platform // // Created by Krunoslav Zaher on 12/29/15. // Copyright © 2015 Krunoslav Zaher. All rights reserved. // #if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) import Darwin import class Foundation.Thread import func Foundation.OSAtomicCompareAndSwap32Barrier import func Foundation.OSAtomicIncrement32Barrier import func Foundation.OSAtomicDecrement32Barrier import protocol Foundation.NSCopying typealias AtomicInt = Int32 fileprivate func castToUInt32Pointer(_ pointer: UnsafeMutablePointer<Int32>) -> UnsafeMutablePointer<UInt32> { let raw = UnsafeMutableRawPointer(pointer) return raw.assumingMemoryBound(to: UInt32.self) } let AtomicCompareAndSwap = OSAtomicCompareAndSwap32Barrier let AtomicIncrement = OSAtomicIncrement32Barrier let AtomicDecrement = OSAtomicDecrement32Barrier func AtomicOr(_ mask: UInt32, _ theValue : UnsafeMutablePointer<Int32>) -> Int32 { return OSAtomicOr32OrigBarrier(mask, castToUInt32Pointer(theValue)) } func AtomicFlagSet(_ mask: UInt32, _ theValue : UnsafeMutablePointer<Int32>) -> Bool { // just used to create a barrier OSAtomicXor32OrigBarrier(0, castToUInt32Pointer(theValue)) return (theValue.pointee & Int32(mask)) != 0 } extension Thread { static func setThreadLocalStorageValue<T: AnyObject>(_ value: T?, forKey key: NSCopying ) { let currentThread = Thread.current let threadDictionary = currentThread.threadDictionary if let newValue = value { threadDictionary[key] = newValue } else { threadDictionary[key] = nil } } static func getThreadLocalStorageValueForKey<T>(_ key: NSCopying) -> T? { let currentThread = Thread.current let threadDictionary = currentThread.threadDictionary return threadDictionary[key] as? T } } extension AtomicInt { func valueSnapshot() -> Int32 { return self } } #endif