2016-10-15 23:10:40 +03:00
|
|
|
//
|
|
|
|
// Platform.Linux.swift
|
2016-10-19 23:45:27 +03:00
|
|
|
// Platform
|
2016-10-15 23:10:40 +03:00
|
|
|
//
|
|
|
|
// Created by Krunoslav Zaher on 12/29/15.
|
|
|
|
// Copyright © 2015 Krunoslav Zaher. All rights reserved.
|
|
|
|
//
|
|
|
|
|
|
|
|
#if os(Linux)
|
|
|
|
|
|
|
|
import Foundation
|
|
|
|
import XCTest
|
|
|
|
import Glibc
|
|
|
|
import SwiftShims
|
|
|
|
|
2016-10-15 23:36:09 +03:00
|
|
|
final class AtomicInt {
|
2016-10-15 23:10:40 +03:00
|
|
|
typealias IntegerLiteralType = Int
|
|
|
|
fileprivate var value: Int32 = 0
|
2017-01-16 01:06:43 +03:00
|
|
|
fileprivate var _lock = RecursiveLock()
|
2016-10-15 23:10:40 +03:00
|
|
|
|
|
|
|
func lock() {
|
|
|
|
_lock.lock()
|
|
|
|
}
|
|
|
|
func unlock() {
|
|
|
|
_lock.unlock()
|
|
|
|
}
|
|
|
|
|
|
|
|
func valueSnapshot() -> Int32 {
|
|
|
|
return value
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
extension AtomicInt: ExpressibleByIntegerLiteral {
|
2016-10-15 23:36:09 +03:00
|
|
|
convenience init(integerLiteral value: Int) {
|
|
|
|
self.init()
|
|
|
|
self.value = Int32(value)
|
2016-10-15 23:10:40 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-10-15 23:36:09 +03:00
|
|
|
func >(lhs: AtomicInt, rhs: Int32) -> Bool {
|
2016-10-15 23:10:40 +03:00
|
|
|
return lhs.value > rhs
|
|
|
|
}
|
2016-10-15 23:36:09 +03:00
|
|
|
func ==(lhs: AtomicInt, rhs: Int32) -> Bool {
|
2016-10-15 23:10:40 +03:00
|
|
|
return lhs.value == rhs
|
|
|
|
}
|
|
|
|
|
2016-10-15 23:36:09 +03:00
|
|
|
func AtomicIncrement(_ atomic: inout AtomicInt) -> Int32 {
|
2016-10-15 23:10:40 +03:00
|
|
|
atomic.lock(); defer { atomic.unlock() }
|
|
|
|
atomic.value += 1
|
|
|
|
return atomic.value
|
|
|
|
}
|
|
|
|
|
2016-10-15 23:36:09 +03:00
|
|
|
func AtomicDecrement(_ atomic: inout AtomicInt) -> Int32 {
|
2016-10-15 23:10:40 +03:00
|
|
|
atomic.lock(); defer { atomic.unlock() }
|
|
|
|
atomic.value -= 1
|
|
|
|
return atomic.value
|
|
|
|
}
|
|
|
|
|
2016-10-15 23:36:09 +03:00
|
|
|
func AtomicCompareAndSwap(_ l: Int32, _ r: Int32, _ atomic: inout AtomicInt) -> Bool {
|
2016-10-15 23:10:40 +03:00
|
|
|
atomic.lock(); defer { atomic.unlock() }
|
|
|
|
if atomic.value == l {
|
|
|
|
atomic.value = r
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
|
|
|
extension Thread {
|
|
|
|
|
|
|
|
static func setThreadLocalStorageValue<T: AnyObject>(_ value: T?, forKey key: String) {
|
|
|
|
let currentThread = Thread.current
|
|
|
|
var threadDictionary = currentThread.threadDictionary
|
|
|
|
|
|
|
|
if let newValue = value {
|
|
|
|
threadDictionary[key] = newValue
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
threadDictionary[key] = nil
|
|
|
|
}
|
|
|
|
|
|
|
|
currentThread.threadDictionary = threadDictionary
|
|
|
|
}
|
|
|
|
|
|
|
|
static func getThreadLocalStorageValueForKey<T: AnyObject>(_ key: String) -> T? {
|
|
|
|
let currentThread = Thread.current
|
|
|
|
let threadDictionary = currentThread.threadDictionary
|
|
|
|
|
|
|
|
return threadDictionary[key] as? T
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif
|