Files
ShadowsocksX-NG/Pods/RxCocoa/Platform/Platform.Darwin.swift

67 lines
2.1 KiB
Swift
Raw Normal View History

2017-03-17 23:08:52 +08:00
//
// 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
2017-03-20 21:26:25 +08:00
import class Foundation.Thread
import func Foundation.OSAtomicCompareAndSwap32Barrier
import func Foundation.OSAtomicIncrement32Barrier
import func Foundation.OSAtomicDecrement32Barrier
import protocol Foundation.NSCopying
2017-03-17 23:08:52 +08:00
typealias AtomicInt = Int32
2017-03-20 21:26:25 +08:00
fileprivate func castToUInt32Pointer(_ pointer: UnsafeMutablePointer<Int32>) -> UnsafeMutablePointer<UInt32> {
let raw = UnsafeMutableRawPointer(pointer)
return raw.assumingMemoryBound(to: UInt32.self)
}
2017-03-17 23:08:52 +08:00
let AtomicCompareAndSwap = OSAtomicCompareAndSwap32Barrier
let AtomicIncrement = OSAtomicIncrement32Barrier
let AtomicDecrement = OSAtomicDecrement32Barrier
2017-03-20 21:26:25 +08:00
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
}
2017-03-17 23:08:52 +08:00
extension Thread {
2017-03-20 21:26:25 +08:00
static func setThreadLocalStorageValue<T: AnyObject>(_ value: T?, forKey key: NSCopying
2017-03-17 23:08:52 +08:00
) {
let currentThread = Thread.current
let threadDictionary = currentThread.threadDictionary
if let newValue = value {
threadDictionary[key] = newValue
}
else {
threadDictionary[key] = nil
}
}
2017-03-20 21:26:25 +08:00
static func getThreadLocalStorageValueForKey<T>(_ key: NSCopying) -> T? {
2017-03-17 23:08:52 +08:00
let currentThread = Thread.current
let threadDictionary = currentThread.threadDictionary
return threadDictionary[key] as? T
}
}
extension AtomicInt {
func valueSnapshot() -> Int32 {
return self
}
}
#endif