67 lines
2.1 KiB
Swift
67 lines
2.1 KiB
Swift
//
|
|
// 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
|