Fix concurrency thread-safe exception

This commit is contained in:
Peter Tang
2023-09-26 13:07:49 +08:00
parent 2f962f98c3
commit 1cf614036f
4 changed files with 77 additions and 10 deletions

View File

@@ -76,7 +76,9 @@ private class BundleManager {
private var ctFonts = [CTFontSizePair: CTFont]()
private var rawMathTables = [MathFont: NSDictionary]()
private let threadSafeQueue = DispatchQueue(label: "com.smartmath.mathfont.threadsafequeue", attributes: .concurrent)
private let threadSafeQueue = DispatchQueue(label: "com.smartmath.mathfont.threadsafequeue",
qos: .userInitiated,
attributes: .concurrent)
private func registerCGFont(mathFont: MathFont) throws {
guard let frameworkBundleURL = Bundle.module.url(forResource: "mathFonts", withExtension: "bundle"),

View File

@@ -62,6 +62,7 @@ public class MTMathAtomFactory {
"rfloor" : "\u{230B}"
]
private static let delimValueLock = NSLock()
static var _delimValueToName = [String: String]()
public static var delimValueToName: [String: String] {
if _delimValueToName.isEmpty {
@@ -78,7 +79,11 @@ public class MTMathAtomFactory {
}
output[value] = key
}
_delimValueToName = output
delimValueLock.lock()
defer { delimValueLock.unlock() }
if _delimValueToName.isEmpty {
_delimValueToName = output
}
}
return _delimValueToName
}
@@ -98,6 +103,7 @@ public class MTMathAtomFactory {
"widetilde" : "\u{0303}"
]
private static let accentValueLock = NSLock()
static var _accentValueToName: [String: String]? = nil
public static var accentValueToName: [String: String] {
if _accentValueToName == nil {
@@ -115,7 +121,11 @@ public class MTMathAtomFactory {
}
output[value] = key
}
_accentValueToName = output
accentValueLock.lock()
defer { accentValueLock.unlock() }
if _accentValueToName == nil {
_accentValueToName = output
}
}
return _accentValueToName!
}
@@ -390,6 +400,7 @@ public class MTMathAtomFactory {
"scriptscriptstyle" : MTMathStyle(style: .scriptOfScript),
]
private static let textToLatexLock = NSLock()
static var _textToLatexSymbolName: [String: String]? = nil
public static var textToLatexSymbolName: [String: String] {
get {
@@ -413,13 +424,17 @@ public class MTMathAtomFactory {
}
output[atom.nucleus] = key
}
self._textToLatexSymbolName = output
textToLatexLock.lock()
defer { textToLatexLock.unlock() }
if self._textToLatexSymbolName == nil {
self._textToLatexSymbolName = output
}
}
return self._textToLatexSymbolName!
}
set {
self._textToLatexSymbolName = newValue
}
// set {
// self._textToLatexSymbolName = newValue
// }
}
// public static let sharedInstance = MTMathAtomFactory()
@@ -603,8 +618,13 @@ public class MTMathAtomFactory {
e.g. to define a symbol for "lcm" one can call:
`MTMathAtomFactory.add(latexSymbol:"lcm", value:MTMathAtomFactory.operatorWithName("lcm", limits: false))` */
public static func add(latexSymbol name: String, value: MTMathAtom) {
let _ = Self.textToLatexSymbolName
// above force textToLatexSymbolName to instantiate first, _textToLatexSymbolName also initialized.
textToLatexLock.lock()
defer { textToLatexLock.unlock() }
supportedLatexSymbols[name] = value
Self.textToLatexSymbolName[value.nucleus] = name
// below update the underlying dictionary entry.
Self._textToLatexSymbolName?[value.nucleus] = name
}
/** Returns a large opertor for the given name. If limits is true, limits are set up on

View File

@@ -21,9 +21,15 @@ enum InterElementSpaceType : Int {
}
var interElementSpaceArray = [[InterElementSpaceType]]()
private let interElementLock = NSLock()
func getInterElementSpaces() -> [[InterElementSpaceType]] {
if interElementSpaceArray.isEmpty {
interElementLock.lock()
defer { interElementLock.unlock() }
guard interElementSpaceArray.isEmpty else { return interElementSpaceArray }
interElementSpaceArray =
// ordinary operator binary relation open close punct fraction
[ [.none, .thin, .nsMedium, .nsThick, .none, .none, .none, .nsThin], // ordinary