Merge pull request #33 from a-lebedev/feature/fix_crash_for_getting_fonts
This commit is contained in:
@@ -22,9 +22,10 @@ public class MTFontManager {
|
||||
}
|
||||
|
||||
public init() { }
|
||||
|
||||
|
||||
@RWLocked
|
||||
var nameToFontMap = [String: MTFont]()
|
||||
|
||||
|
||||
public func font(withName name:String, size:CGFloat) -> MTFont? {
|
||||
var f = self.nameToFontMap[name]
|
||||
if f == nil {
|
||||
|
||||
58
Sources/SwiftMath/MathRender/RWLock.swift
Normal file
58
Sources/SwiftMath/MathRender/RWLock.swift
Normal file
@@ -0,0 +1,58 @@
|
||||
import Foundation
|
||||
|
||||
final class RWLock {
|
||||
init() {
|
||||
pthread_rwlock_init(&lock, nil)
|
||||
}
|
||||
|
||||
deinit {
|
||||
pthread_rwlock_destroy(&lock)
|
||||
}
|
||||
|
||||
func read<T>(_ block: () -> T) -> T {
|
||||
pthread_rwlock_rdlock(&lock)
|
||||
defer { pthread_rwlock_unlock(&lock) }
|
||||
return block()
|
||||
}
|
||||
|
||||
func readWrite<T>(_ block: () -> T) -> T {
|
||||
pthread_rwlock_wrlock(&lock)
|
||||
defer { pthread_rwlock_unlock(&lock) }
|
||||
return block()
|
||||
}
|
||||
|
||||
private var lock = pthread_rwlock_t()
|
||||
}
|
||||
|
||||
@propertyWrapper
|
||||
struct RWLocked<T> {
|
||||
init(wrappedValue: T) {
|
||||
value = wrappedValue
|
||||
}
|
||||
|
||||
var wrappedValue: T {
|
||||
get {
|
||||
lock.read {
|
||||
value
|
||||
}
|
||||
}
|
||||
set {
|
||||
lock.readWrite {
|
||||
value = newValue
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@discardableResult
|
||||
mutating func readWrite(_ block: (inout T) -> Void) -> (oldValue: T, newValue: T) {
|
||||
lock.readWrite {
|
||||
let old = value
|
||||
block(&value)
|
||||
return (old, value)
|
||||
}
|
||||
}
|
||||
|
||||
private var value: T
|
||||
private let lock = RWLock()
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user