diff --git a/.github/workflows/run-tests.yml b/.github/workflows/run-tests.yml index 82ca58ad..193f46cb 100644 --- a/.github/workflows/run-tests.yml +++ b/.github/workflows/run-tests.yml @@ -24,7 +24,7 @@ jobs: strategy: matrix: environment: [iOS, tvOS, macOS] - timeout-minutes: 5 + timeout-minutes: 7 steps: - name: Checkout repository uses: actions/checkout@v4 diff --git a/.pubnub.yml b/.pubnub.yml index 96a2f99a..99ee1992 100644 --- a/.pubnub.yml +++ b/.pubnub.yml @@ -1,9 +1,14 @@ --- name: swift scm: github.com/pubnub/swift -version: "8.2.4" +version: "8.2.5" schema: 1 changelog: + - date: 2025-01-16 + version: 8.2.5 + changes: + - type: bug + text: "Fix the crash issue caused by multiple accesses to the `state` property in multithreaded scenarios." - date: 2025-01-10 version: 8.2.4 changes: @@ -643,7 +648,7 @@ sdks: - distribution-type: source distribution-repository: GitHub release package-name: PubNub - location: https://github.com/pubnub/swift/archive/refs/tags/8.2.4.zip + location: https://github.com/pubnub/swift/archive/refs/tags/8.2.5.zip supported-platforms: supported-operating-systems: macOS: diff --git a/PubNub.xcodeproj/project.pbxproj b/PubNub.xcodeproj/project.pbxproj index 315ac109..9449e86a 100644 --- a/PubNub.xcodeproj/project.pbxproj +++ b/PubNub.xcodeproj/project.pbxproj @@ -3999,7 +3999,7 @@ "@loader_path/Frameworks", ); MACOSX_DEPLOYMENT_TARGET = 10.15; - MARKETING_VERSION = 8.2.4; + MARKETING_VERSION = 8.2.5; MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu11 gnu++17"; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; @@ -4050,7 +4050,7 @@ "@loader_path/Frameworks", ); MACOSX_DEPLOYMENT_TARGET = 10.15; - MARKETING_VERSION = 8.2.4; + MARKETING_VERSION = 8.2.5; MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu11 gnu++17"; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; @@ -4158,7 +4158,7 @@ "@loader_path/Frameworks", ); MACOSX_DEPLOYMENT_TARGET = 10.15; - MARKETING_VERSION = 8.2.4; + MARKETING_VERSION = 8.2.5; MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu11 gnu++17"; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; @@ -4211,7 +4211,7 @@ "@loader_path/Frameworks", ); MACOSX_DEPLOYMENT_TARGET = 10.15; - MARKETING_VERSION = 8.2.4; + MARKETING_VERSION = 8.2.5; MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu11 gnu++17"; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; @@ -4332,7 +4332,7 @@ "@loader_path/Frameworks", ); MACOSX_DEPLOYMENT_TARGET = 10.15; - MARKETING_VERSION = 8.2.4; + MARKETING_VERSION = 8.2.5; MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu11 gnu++17"; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; @@ -4384,7 +4384,7 @@ "@loader_path/Frameworks", ); MACOSX_DEPLOYMENT_TARGET = 10.15; - MARKETING_VERSION = 8.2.4; + MARKETING_VERSION = 8.2.5; MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu11 gnu++17"; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; @@ -4864,7 +4864,7 @@ "$(TOOLCHAIN_DIR)/usr/lib/swift/macosx", ); MACOSX_DEPLOYMENT_TARGET = 10.15; - MARKETING_VERSION = 8.2.4; + MARKETING_VERSION = 8.2.5; MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++14"; OTHER_CFLAGS = "$(inherited)"; OTHER_LDFLAGS = "$(inherited)"; @@ -4907,7 +4907,7 @@ "$(TOOLCHAIN_DIR)/usr/lib/swift/macosx", ); MACOSX_DEPLOYMENT_TARGET = 10.15; - MARKETING_VERSION = 8.2.4; + MARKETING_VERSION = 8.2.5; MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++14"; OTHER_CFLAGS = "$(inherited)"; OTHER_LDFLAGS = "$(inherited)"; diff --git a/PubNubSwift.podspec b/PubNubSwift.podspec index a2bc9900..c122ac77 100644 --- a/PubNubSwift.podspec +++ b/PubNubSwift.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'PubNubSwift' - s.version = '8.2.4' + s.version = '8.2.5' s.homepage = 'https://github.com/pubnub/swift' s.documentation_url = 'https://www.pubnub.com/docs/swift-native/pubnub-swift-sdk' s.authors = { 'PubNub, Inc.' => 'support@pubnub.com' } diff --git a/Sources/PubNub/EventEngine/Core/EventEngine.swift b/Sources/PubNub/EventEngine/Core/EventEngine.swift index fc085585..527421a8 100644 --- a/Sources/PubNub/EventEngine/Core/EventEngine.swift +++ b/Sources/PubNub/EventEngine/Core/EventEngine.swift @@ -17,7 +17,20 @@ struct EventEngineDependencies { class EventEngine { private let transition: any TransitionProtocol private let dispatcher: any Dispatcher - private(set) var state: State + private let recursiveLock = NSRecursiveLock() + private var internalStateContainer: State + + private(set) var state: State { + get { + recursiveLock.lock() + defer { recursiveLock.unlock() } + return internalStateContainer + } set { + recursiveLock.lock() + defer { recursiveLock.unlock() } + internalStateContainer = newValue + } + } var dependencies: EventEngineDependencies var onStateUpdated: ((State) -> Void)? @@ -29,7 +42,7 @@ class EventEngine { dispatcher: some Dispatcher, dependencies: EventEngineDependencies ) { - self.state = state + self.internalStateContainer = state self.onStateUpdated = onStateUpdated self.transition = transition self.dispatcher = dispatcher @@ -37,19 +50,22 @@ class EventEngine { } func send(event: Event) { - objc_sync_enter(self) + recursiveLock.lock() defer { - objc_sync_exit(self) + recursiveLock.unlock() } + + let currentState = state + guard transition.canTransition( - from: state, + from: currentState, dueTo: event ) else { return } - let transitionResult = transition.transition(from: state, event: event) + let transitionResult = transition.transition(from: currentState, event: event) let invocations = transitionResult.invocations state = transitionResult.state diff --git a/Sources/PubNub/Helpers/Constants.swift b/Sources/PubNub/Helpers/Constants.swift index 77d2f0d2..7cc3236e 100644 --- a/Sources/PubNub/Helpers/Constants.swift +++ b/Sources/PubNub/Helpers/Constants.swift @@ -57,7 +57,7 @@ public enum Constant { static let pubnubSwiftSDKName: String = "PubNubSwift" - static let pubnubSwiftSDKVersion: String = "8.2.4" + static let pubnubSwiftSDKVersion: String = "8.2.5" static let appBundleId: String = { if let info = Bundle.main.infoDictionary, diff --git a/fastlane/.env.ios b/fastlane/.env.ios index b54a7eec..1a2653ae 100644 --- a/fastlane/.env.ios +++ b/fastlane/.env.ios @@ -1,7 +1,7 @@ -DEVICES="iPhone 13 (15.5),iPhone 15 (17.5)" -COVERAGE="iPhone 15 (17.5)" +DEVICES="generic/platform=iOS Simulator" +COVERAGE="generic/platform=iOS Simulator" -DESTINATION_EXAMPLE="OS=17.4,name=iPhone 15" +DESTINATION_EXAMPLE="generic/platform=iOS Simulator" TEST_OUTPUT_DIR="fastlane/test_output/iOS" SCHEME_EXAMPLE=Example-iOS PLATFORM=ios diff --git a/fastlane/.env.tvos b/fastlane/.env.tvos index 62526f60..6e15bce4 100644 --- a/fastlane/.env.tvos +++ b/fastlane/.env.tvos @@ -1,5 +1,5 @@ -DEVICES="Apple TV (15.4),Apple TV (17.5)" -COVERAGE="Apple TV (17.5)" +DEVICES="generic/platform=tvOS Simulator" +COVERAGE="generic/platform=tvOS Simulator" TEST_OUTPUT_DIR="fastlane/test_output/tvOS" PLATFORM=tvos