diff --git a/Package.swift b/Package.swift index 2365757..b69602b 100644 --- a/Package.swift +++ b/Package.swift @@ -1,19 +1,21 @@ -// swift-tools-version:4.0 +// swift-tools-version:5.1 // Generated automatically by Perfect Assistant // Date: 2018-05-31 18:31:13 +0000 import PackageDescription let package = Package( name: "PerfectMustache", + platforms: [ + .macOS(.v10_15) + ], products: [ .library(name: "PerfectMustache", targets: ["PerfectMustache"]) ], dependencies: [ - .package(url: "https://github.com/PerfectlySoft/Perfect-Thread.git", from: "3.0.0"), - .package(url: "https://github.com/PerfectlySoft/PerfectLib.git", from: "3.0.0"), + .package(url: "https://github.com/PerfectlySoft/PerfectLib.git", from: "4.0.0"), ], targets: [ - .target(name: "PerfectMustache", dependencies: ["PerfectThread", "PerfectLib"]), + .target(name: "PerfectMustache", dependencies: ["PerfectLib"]), .testTarget(name: "PerfectMustacheTests", dependencies: ["PerfectMustache"]) ] ) diff --git a/Sources/PerfectMustache/Mustache.swift b/Sources/PerfectMustache/Mustache.swift index d60d13c..fcb8d33 100644 --- a/Sources/PerfectMustache/Mustache.swift +++ b/Sources/PerfectMustache/Mustache.swift @@ -17,31 +17,29 @@ //===----------------------------------------------------------------------===// // -import PerfectThread import PerfectLib import Foundation let mustacheExtension = "mustache" private var mustacheTemplateCache = [String: (Int, MustacheTemplate)]() -private let mustacheTemplateCacheLock = Threading.RWLock() +private let mustacheTemplateCacheQueue = DispatchQueue(label: "mustacheTemplateCache", attributes: .concurrent) private func getTemplateFromCache(_ path: String) throws -> MustacheTemplate { let file = File(path) - var template: MustacheTemplate? let modDate = file.modificationTime - - mustacheTemplateCacheLock.doWithReadLock { + var template: MustacheTemplate? = mustacheTemplateCacheQueue.sync { if let fnd = mustacheTemplateCache[path], fnd.0 == modDate { - template = fnd.1.clone() as? MustacheTemplate + return fnd.1.clone() as? MustacheTemplate } + return nil } if let templateW = template?.clone() as? MustacheTemplate { return templateW } - try mustacheTemplateCacheLock.doWithWriteLock { + template = try mustacheTemplateCacheQueue.sync(flags: .barrier) { if let fnd = mustacheTemplateCache[path], fnd.0 == modDate { - template = fnd.1.clone() as? MustacheTemplate + return fnd.1.clone() as? MustacheTemplate } else { try file.open() defer { file.close() } @@ -51,7 +49,7 @@ private func getTemplateFromCache(_ path: String) throws -> MustacheTemplate { let str = UTF8Encoding.encode(bytes: bytes) let templateW = try parser.parse(string: str) mustacheTemplateCache[path] = (modDate, templateW) - template = templateW.clone() as? MustacheTemplate + return templateW.clone() as? MustacheTemplate } } guard let templateW = template else {