From f331821314f9b35867a18c5c8fc2f918536d79ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?D=C3=ADdac=20Coll=20Pujals?= Date: Mon, 3 Jun 2024 19:41:32 +0200 Subject: [PATCH 1/3] Include PrivacyInfo.xcprivacy manifest on Krono's target from Kronos.xcodeproj (#117) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add new script Copy Bundle Resource on Krono's Build Phase and include the PrivacyInfo.xcprivacy, otherwise when running xcodebuild create-xcframework command the manifest isn't included on Kronos.xcframework. Signed-off-by: Dídac Coll --- Kronos.xcodeproj/project.pbxproj | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/Kronos.xcodeproj/project.pbxproj b/Kronos.xcodeproj/project.pbxproj index 31dc1e6..01c7de0 100644 --- a/Kronos.xcodeproj/project.pbxproj +++ b/Kronos.xcodeproj/project.pbxproj @@ -20,6 +20,7 @@ 26447D8A1D6E54FF00159BEE /* DNSResolverTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26447D861D6E54FF00159BEE /* DNSResolverTests.swift */; }; 26447D8B1D6E54FF00159BEE /* NTPClientTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26447D871D6E54FF00159BEE /* NTPClientTests.swift */; }; 26447D8C1D6E54FF00159BEE /* NTPPacketTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26447D881D6E54FF00159BEE /* NTPPacketTests.swift */; }; + 5D6654E82BF520FA00FCE215 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 5DB5A05F2BAAF67D0069CCF9 /* PrivacyInfo.xcprivacy */; }; 930B39DD2051E6D300360BA2 /* TimeStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 930B39DC2051E6D300360BA2 /* TimeStorage.swift */; }; 930B39E02051F26500360BA2 /* TimeStorageTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 930B39DE2051F25300360BA2 /* TimeStorageTests.swift */; }; C201748E1BD5509D00E4FE18 /* Kronos.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C20174831BD5509D00E4FE18 /* Kronos.framework */; }; @@ -156,6 +157,7 @@ buildConfigurationList = C20174971BD5509D00E4FE18 /* Build configuration list for PBXNativeTarget "Kronos" */; buildPhases = ( C201747E1BD5509D00E4FE18 /* Sources */, + 5D6654E72BF520F600FCE215 /* Resources */, ); buildRules = ( ); @@ -222,6 +224,17 @@ }; /* End PBXProject section */ +/* Begin PBXResourcesBuildPhase section */ + 5D6654E72BF520F600FCE215 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 5D6654E82BF520FA00FCE215 /* PrivacyInfo.xcprivacy in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + /* Begin PBXSourcesBuildPhase section */ C201747E1BD5509D00E4FE18 /* Sources */ = { isa = PBXSourcesBuildPhase; From 543cae037bfc13a7d722e233a92a212b42d9e750 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20=C5=A0r=C5=AFtek?= <35694712+michalsrutek@users.noreply.github.com> Date: Thu, 12 Jun 2025 19:52:42 +0200 Subject: [PATCH 2/3] Fix Package.swift typo (#120) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Michal Šrůtek <35694712+michalsrutek@users.noreply.github.com> --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 0a71b9a..6c254db 100644 --- a/README.md +++ b/README.md @@ -57,7 +57,7 @@ pod 'Kronos' ### Swift Package Manager -Add Kronos to your `Pacakge.swift`: +Add Kronos to your `Package.swift`: ```bash .package(name: "Kronos", url: "https://github.com/MobileNativeFoundation/Kronos.git", .upToNextMajor(from: "TAG")), From 9fafb2a0d9aa871135e867273ccb3b7858374514 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Seweryn=20Plaz=CC=87uk?= Date: Thu, 1 Feb 2024 17:19:23 +0100 Subject: [PATCH 3/3] Add thread safety to Clock MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Seweryn Plażuk --- Kronos.xcodeproj/project.pbxproj | 4 ++++ Sources/Clock.swift | 15 +++++++++++++-- Sources/UnfairLock.swift | 29 +++++++++++++++++++++++++++++ 3 files changed, 46 insertions(+), 2 deletions(-) create mode 100644 Sources/UnfairLock.swift diff --git a/Kronos.xcodeproj/project.pbxproj b/Kronos.xcodeproj/project.pbxproj index 01c7de0..36c22e2 100644 --- a/Kronos.xcodeproj/project.pbxproj +++ b/Kronos.xcodeproj/project.pbxproj @@ -24,6 +24,7 @@ 930B39DD2051E6D300360BA2 /* TimeStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 930B39DC2051E6D300360BA2 /* TimeStorage.swift */; }; 930B39E02051F26500360BA2 /* TimeStorageTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 930B39DE2051F25300360BA2 /* TimeStorageTests.swift */; }; C201748E1BD5509D00E4FE18 /* Kronos.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C20174831BD5509D00E4FE18 /* Kronos.framework */; }; + E5E7A7702BFE559F0025D9D0 /* UnfairLock.swift in Sources */ = {isa = PBXBuildFile; fileRef = E5E7A76F2BFE559F0025D9D0 /* UnfairLock.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -59,6 +60,7 @@ C2C036D41C2B180D003FB853 /* UniversalFramework_Base.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = UniversalFramework_Base.xcconfig; sourceTree = ""; }; C2C036D51C2B180D003FB853 /* UniversalFramework_Framework.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = UniversalFramework_Framework.xcconfig; sourceTree = ""; }; C2C036D61C2B180D003FB853 /* UniversalFramework_Test.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = UniversalFramework_Test.xcconfig; sourceTree = ""; }; + E5E7A76F2BFE559F0025D9D0 /* UnfairLock.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UnfairLock.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -125,6 +127,7 @@ 26447D7B1D6E54D400159BEE /* TimeFreeze.swift */, 930B39DC2051E6D300360BA2 /* TimeStorage.swift */, 5DB5A05F2BAAF67D0069CCF9 /* PrivacyInfo.xcprivacy */, + E5E7A76F2BFE559F0025D9D0 /* UnfairLock.swift */, ); path = Sources; sourceTree = ""; @@ -247,6 +250,7 @@ 26447D7E1D6E54D400159BEE /* InternetAddress.swift in Sources */, 26447D811D6E54D400159BEE /* NTPClient.swift in Sources */, 26447D7F1D6E54D400159BEE /* Data+Bytes.swift in Sources */, + E5E7A7702BFE559F0025D9D0 /* UnfairLock.swift in Sources */, 26447D841D6E54D400159BEE /* TimeFreeze.swift in Sources */, 26447D821D6E54D400159BEE /* NTPPacket.swift in Sources */, 26447D801D6E54D400159BEE /* NSTimer+ClosureKit.swift in Sources */, diff --git a/Sources/Clock.swift b/Sources/Clock.swift index fade988..b0c91a5 100644 --- a/Sources/Clock.swift +++ b/Sources/Clock.swift @@ -25,9 +25,20 @@ public typealias AnnotatedTime = ( /// print(Clock.now) /// ``` public struct Clock { + private static let lock = UnfairLock() + + private static var _stableTime: TimeFreeze? private static var stableTime: TimeFreeze? { - didSet { - self.storage.stableTime = self.stableTime + get { + self.lock.around { + return self._stableTime + } + } + set { + self.lock.around { + self._stableTime = newValue + self.storage.stableTime = newValue + } } } diff --git a/Sources/UnfairLock.swift b/Sources/UnfairLock.swift new file mode 100644 index 0000000..47b01c5 --- /dev/null +++ b/Sources/UnfairLock.swift @@ -0,0 +1,29 @@ +import Foundation + +final class UnfairLock { + private let unfairLock: os_unfair_lock_t + + init() { + unfairLock = .allocate(capacity: 1) + unfairLock.initialize(to: os_unfair_lock()) + } + + deinit { + unfairLock.deinitialize(count: 1) + unfairLock.deallocate() + } + + func around(_ block: () -> T) -> T { + lock() + defer { unlock() } + return block() + } + + private func lock() { + os_unfair_lock_lock(unfairLock) + } + + private func unlock() { + os_unfair_lock_unlock(unfairLock) + } +}