fix thread safety problem in entities

This commit is contained in:
xukun 2022-03-31 14:30:50 +08:00
parent 5fa9decdb5
commit 69bb8f9820
4 changed files with 114 additions and 16 deletions

File diff suppressed because one or more lines are too long

30
Sources/Mutex.swift Normal file
View File

@ -0,0 +1,30 @@
//
// Mutex.swift
// SwiftSoup
//
// Created by xukun on 2022/3/31.
// Copyright © 2022 Nabil Chatbi. All rights reserved.
//
import Foundation
final class Mutex: NSLocking {
private var mutex = pthread_mutex_t()
init() {
pthread_mutex_init(&mutex, nil)
}
deinit {
pthread_mutex_destroy(&mutex)
}
func lock() {
pthread_mutex_lock(&mutex)
}
func unlock() {
pthread_mutex_unlock(&mutex)
}
}

37
Sources/UnfairLock.swift Normal file
View File

@ -0,0 +1,37 @@
//
// UnfairLock.swift
// SwiftSoup
//
// Created by xukun on 2022/3/31.
// Copyright © 2022 Nabil Chatbi. All rights reserved.
//
import Foundation
@available(iOSApplicationExtension 10.0, *)
@available(macOSApplicationExtension 10.12, *)
final class UnfairLock: NSLocking {
private let unfairLock: UnsafeMutablePointer<os_unfair_lock> = {
let pointer = UnsafeMutablePointer<os_unfair_lock>.allocate(capacity: 1)
pointer.initialize(to: os_unfair_lock())
return pointer
}()
deinit {
unfairLock.deinitialize(count: 1)
unfairLock.deallocate()
}
func lock() {
os_unfair_lock_lock(unfairLock)
}
func tryLock() -> Bool {
os_unfair_lock_trylock(unfairLock)
}
func unlock() {
os_unfair_lock_unlock(unfairLock)
}
}

View File

@ -7,6 +7,14 @@
objects = {
/* Begin PBXBuildFile section */
6710742C27F57FA60048E7C1 /* UnfairLock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6710742B27F57FA60048E7C1 /* UnfairLock.swift */; };
6710742D27F57FA60048E7C1 /* UnfairLock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6710742B27F57FA60048E7C1 /* UnfairLock.swift */; };
6710742E27F57FA60048E7C1 /* UnfairLock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6710742B27F57FA60048E7C1 /* UnfairLock.swift */; };
6710742F27F57FA60048E7C1 /* UnfairLock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6710742B27F57FA60048E7C1 /* UnfairLock.swift */; };
6710743127F580530048E7C1 /* Mutex.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6710743027F580530048E7C1 /* Mutex.swift */; };
6710743227F580530048E7C1 /* Mutex.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6710743027F580530048E7C1 /* Mutex.swift */; };
6710743327F580530048E7C1 /* Mutex.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6710743027F580530048E7C1 /* Mutex.swift */; };
6710743427F580530048E7C1 /* Mutex.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6710743027F580530048E7C1 /* Mutex.swift */; };
8C19C82F1DB7E5D200B8FC22 /* Tokeniser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8C19C82E1DB7E5D200B8FC22 /* Tokeniser.swift */; };
8C19C8311DB7E8CD00B8FC22 /* ParseError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8C19C8301DB7E8CD00B8FC22 /* ParseError.swift */; };
8C19C8331DB7ECB700B8FC22 /* ParseErrorList.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8C19C8321DB7ECB700B8FC22 /* ParseErrorList.swift */; };
@ -288,6 +296,8 @@
/* End PBXContainerItemProxy section */
/* Begin PBXFileReference section */
6710742B27F57FA60048E7C1 /* UnfairLock.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UnfairLock.swift; sourceTree = "<group>"; };
6710743027F580530048E7C1 /* Mutex.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Mutex.swift; sourceTree = "<group>"; };
8C19C82E1DB7E5D200B8FC22 /* Tokeniser.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Tokeniser.swift; sourceTree = "<group>"; };
8C19C8301DB7E8CD00B8FC22 /* ParseError.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ParseError.swift; sourceTree = "<group>"; };
8C19C8321DB7ECB700B8FC22 /* ParseErrorList.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ParseErrorList.swift; sourceTree = "<group>"; };
@ -461,6 +471,8 @@
8C9380111DC6945B0014DAD6 /* SimpleDictionary.swift */,
8C246B521DD7396200B31DA7 /* OrderedSet.swift */,
8C73DB4A1DDA605900233A68 /* UnicodeScalar.swift */,
6710742B27F57FA60048E7C1 /* UnfairLock.swift */,
6710743027F580530048E7C1 /* Mutex.swift */,
);
name = shared;
sourceTree = "<group>";
@ -943,9 +955,11 @@
8CC2FD8D1DB12382002CB469 /* Whitelist.swift in Sources */,
8C19C82F1DB7E5D200B8FC22 /* Tokeniser.swift in Sources */,
8CD4E8F01E12B0FF0039B951 /* Pattern.swift in Sources */,
6710743127F580530048E7C1 /* Mutex.swift in Sources */,
8CEA295B1DAC23820064A341 /* String.swift in Sources */,
8C89785E1DBCDB0D00B1C024 /* CombiningEvaluator.swift in Sources */,
8CE418621DAA568600240B42 /* Attribute.swift in Sources */,
6710742C27F57FA60048E7C1 /* UnfairLock.swift in Sources */,
8CD48F211DBB6D2F00D1D88F /* Evaluator.swift in Sources */,
8CE418641DAA568600240B42 /* BooleanAttribute.swift in Sources */,
8CD500DE1DAEC9FF002270FC /* TokeniserState.swift in Sources */,
@ -1045,9 +1059,11 @@
BD3B5B6B1FBED933001FDB3B /* Whitelist.swift in Sources */,
BD3B5B6C1FBED933001FDB3B /* Tokeniser.swift in Sources */,
BD3B5B6D1FBED933001FDB3B /* Pattern.swift in Sources */,
6710743227F580530048E7C1 /* Mutex.swift in Sources */,
BD3B5B6E1FBED933001FDB3B /* String.swift in Sources */,
BD3B5B6F1FBED933001FDB3B /* CombiningEvaluator.swift in Sources */,
BD3B5B701FBED933001FDB3B /* Attribute.swift in Sources */,
6710742D27F57FA60048E7C1 /* UnfairLock.swift in Sources */,
BD3B5B711FBED933001FDB3B /* Evaluator.swift in Sources */,
BD3B5B721FBED933001FDB3B /* BooleanAttribute.swift in Sources */,
BD3B5B731FBED933001FDB3B /* TokeniserState.swift in Sources */,
@ -1108,9 +1124,11 @@
BD3B5BAE1FC063BD001FDB3B /* Whitelist.swift in Sources */,
BD3B5BAF1FC063BD001FDB3B /* Tokeniser.swift in Sources */,
BD3B5BB01FC063BD001FDB3B /* Pattern.swift in Sources */,
6710743327F580530048E7C1 /* Mutex.swift in Sources */,
BD3B5BB11FC063BD001FDB3B /* String.swift in Sources */,
BD3B5BB21FC063BD001FDB3B /* CombiningEvaluator.swift in Sources */,
BD3B5BB31FC063BD001FDB3B /* Attribute.swift in Sources */,
6710742E27F57FA60048E7C1 /* UnfairLock.swift in Sources */,
BD3B5BB41FC063BD001FDB3B /* Evaluator.swift in Sources */,
BD3B5BB51FC063BD001FDB3B /* BooleanAttribute.swift in Sources */,
BD3B5BB61FC063BD001FDB3B /* TokeniserState.swift in Sources */,
@ -1171,9 +1189,11 @@
BD3B5BF11FC06423001FDB3B /* Whitelist.swift in Sources */,
BD3B5BF21FC06423001FDB3B /* Tokeniser.swift in Sources */,
BD3B5BF31FC06423001FDB3B /* Pattern.swift in Sources */,
6710743427F580530048E7C1 /* Mutex.swift in Sources */,
BD3B5BF41FC06423001FDB3B /* String.swift in Sources */,
BD3B5BF51FC06423001FDB3B /* CombiningEvaluator.swift in Sources */,
BD3B5BF61FC06423001FDB3B /* Attribute.swift in Sources */,
6710742F27F57FA60048E7C1 /* UnfairLock.swift in Sources */,
BD3B5BF71FC06423001FDB3B /* Evaluator.swift in Sources */,
BD3B5BF81FC06423001FDB3B /* BooleanAttribute.swift in Sources */,
BD3B5BF91FC06423001FDB3B /* TokeniserState.swift in Sources */,