Peter 971273e8f8 Add 'submodules/SSignalKit/' from commit '359b2ee7c9f20f99f221f78e307369ef5ad0ece2'
git-subtree-dir: submodules/SSignalKit
git-subtree-mainline: 4459dc5b47e7db4ea1adb3a43a4324d1c2f9feab
git-subtree-split: 359b2ee7c9f20f99f221f78e307369ef5ad0ece2
2019-06-11 18:57:57 +01:00

44 lines
996 B
Swift

import Foundation
public final class Atomic<T> {
private var lock: pthread_mutex_t
private var value: T
public init(value: T) {
self.lock = pthread_mutex_t()
self.value = value
pthread_mutex_init(&self.lock, nil)
}
deinit {
pthread_mutex_destroy(&self.lock)
}
public func with<R>(_ f: (T) -> R) -> R {
pthread_mutex_lock(&self.lock)
let result = f(self.value)
pthread_mutex_unlock(&self.lock)
return result
}
public func modify(_ f: (T) -> T) -> T {
pthread_mutex_lock(&self.lock)
let result = f(self.value)
self.value = result
pthread_mutex_unlock(&self.lock)
return result
}
public func swap(_ value: T) -> T {
pthread_mutex_lock(&self.lock)
let previous = self.value
self.value = value
pthread_mutex_unlock(&self.lock)
return previous
}
}