77 #import < AppKit/AppKit.h>
88#endif // TARGET_OS_OSX
99
10- #import < libkern/OSAtomic.h>
1110#import " PNConfiguration.h"
1211#import " PubNub+Core.h"
1312#import " PNKeychain.h"
13+ #import " PNHelpers.h"
1414
1515
1616NS_ASSUME_NONNULL_BEGIN
3939
4040 @since 4.5.2
4141 */
42- static OSSpinLock publishSequenceKeychainAccessLock = OS_SPINLOCK_INIT ;
42+ static os_unfair_lock publishSequenceKeychainAccessLock = OS_UNFAIR_LOCK_INIT ;
4343
4444
4545#pragma mark - Structures
@@ -83,7 +83,7 @@ @interface PNPublishSequence () {
8383
8484 @since 4.5.2
8585 */
86- OSSpinLock _lock;
86+ os_unfair_lock _lock;
8787}
8888
8989
@@ -198,19 +198,19 @@ @implementation PNPublishSequence
198198
199199- (NSUInteger )sequenceNumber {
200200
201- OSSpinLockLock (&_lock);
202- NSUInteger sequenceNumber = _sequenceNumber;
203- OSSpinLockUnlock (&_lock);
201+ __block NSUInteger sequenceNumber = 0 ;
202+ pn_lock (&_lock, ^{ sequenceNumber = _sequenceNumber; });
204203
205204 return sequenceNumber;
206205}
207206
208207- (NSUInteger )nextSequenceNumber : (BOOL )shouldUpdateCurrent {
209208
210- OSSpinLockLock (&_lock);
211- NSUInteger sequenceNumber = (_sequenceNumber == NSUIntegerMax ? 1 : _sequenceNumber + 1 );
212- if (shouldUpdateCurrent) { _sequenceNumber = sequenceNumber; }
213- OSSpinLockUnlock (&_lock);
209+ __block NSUInteger sequenceNumber = 0 ;
210+ pn_lock (&_lock, ^{
211+ sequenceNumber = (_sequenceNumber == NSUIntegerMax ? 1 : _sequenceNumber + 1 );
212+ if (shouldUpdateCurrent) { _sequenceNumber = sequenceNumber; }
213+ });
214214
215215 return sequenceNumber;
216216}
@@ -251,7 +251,7 @@ - (instancetype)initForClient:(PubNub *)client {
251251
252252 _client = client;
253253 _publishKey = client.currentConfiguration .publishKey ;
254- _lock = OS_SPINLOCK_INIT ;
254+ _lock = OS_UNFAIR_LOCK_INIT ;
255255
256256 [self loadFromPersistentStorage ];
257257 [self cleanUpIfRequired ];
@@ -263,9 +263,7 @@ - (instancetype)initForClient:(PubNub *)client {
263263
264264- (void )reset {
265265
266- OSSpinLockLock (&_lock);
267- _sequenceNumber = 0 ;
268- OSSpinLockUnlock (&_lock);
266+ pn_lock (&_lock, ^{ _sequenceNumber = 0 ; });
269267 [self saveToPersistentStorage ];
270268}
271269
@@ -274,58 +272,65 @@ - (void)reset {
274272
275273- (void )loadFromPersistentStorage {
276274
277- OSSpinLockLock (&publishSequenceKeychainAccessLock);
278- [PNKeychain valueForKey: kPNPublishSequenceDataKey withCompletionBlock: ^(NSDictionary *sequences) {
275+ pn_lock_async (&publishSequenceKeychainAccessLock, ^(dispatch_block_t completion) {
279276
280- NSMutableDictionary *mutableSequences = [(sequences?: @{}) mutableCopy ];
281- NSMutableDictionary *sequenceData = [(mutableSequences[self .publishKey]?: @{}) mutableCopy ];
282- NSNumber *sequenceNumber = (NSNumber *)sequenceData[PNPublishSequenceData.sequence];
283- sequenceData[PNPublishSequenceData.lastSaveDate] = @([NSDate date ].timeIntervalSince1970 );
284- _sequenceNumber = sequenceNumber.unsignedIntegerValue ;
285- [PNKeychain storeValue: mutableSequences forKey: kPNPublishSequenceDataKey
286- withCompletionBlock: ^(BOOL stored) { OSSpinLockUnlock (&publishSequenceKeychainAccessLock); }];
287- }];
277+ [PNKeychain valueForKey: kPNPublishSequenceDataKey withCompletionBlock: ^(NSDictionary *sequences) {
278+
279+ NSMutableDictionary *mutableSequences = [(sequences?: @{}) mutableCopy ];
280+ NSMutableDictionary *sequenceData = [(mutableSequences[self .publishKey]?: @{}) mutableCopy ];
281+ NSNumber *sequenceNumber = (NSNumber *)sequenceData[PNPublishSequenceData.sequence];
282+ sequenceData[PNPublishSequenceData.lastSaveDate] = @([NSDate date ].timeIntervalSince1970 );
283+ _sequenceNumber = sequenceNumber.unsignedIntegerValue ;
284+ [PNKeychain storeValue: mutableSequences forKey: kPNPublishSequenceDataKey
285+ withCompletionBlock: ^(BOOL stored) { completion (); }];
286+ }];
287+ });
288288}
289289
290290- (void )saveToPersistentStorage {
291291
292- OSSpinLockLock (&publishSequenceKeychainAccessLock);
293- [PNKeychain valueForKey: kPNPublishSequenceDataKey withCompletionBlock: ^(NSDictionary *sequences) {
292+ pn_lock_async (&publishSequenceKeychainAccessLock, ^(dispatch_block_t completion) {
294293
295- NSMutableDictionary *mutableSequences = [(sequences?: @{}) mutableCopy ];
296- NSMutableDictionary *sequenceData = [(mutableSequences[self .publishKey]?: @{}) mutableCopy ];
297- sequenceData[PNPublishSequenceData.sequence] = @(self.sequenceNumber );
298- sequenceData[PNPublishSequenceData.lastSaveDate] = @([NSDate date ].timeIntervalSince1970 );
299- mutableSequences[self .publishKey] = sequenceData;
300- [PNKeychain storeValue: mutableSequences forKey: kPNPublishSequenceDataKey
301- withCompletionBlock: ^(BOOL stored) { OSSpinLockUnlock (&publishSequenceKeychainAccessLock); }];
302- }];
294+ [PNKeychain valueForKey: kPNPublishSequenceDataKey withCompletionBlock: ^(NSDictionary *sequences) {
295+
296+ NSMutableDictionary *mutableSequences = [(sequences?: @{}) mutableCopy ];
297+ NSMutableDictionary *sequenceData = [(mutableSequences[self .publishKey]?: @{}) mutableCopy ];
298+ sequenceData[PNPublishSequenceData.sequence] = @(self.sequenceNumber );
299+ sequenceData[PNPublishSequenceData.lastSaveDate] = @([NSDate date ].timeIntervalSince1970 );
300+ mutableSequences[self .publishKey] = sequenceData;
301+ [PNKeychain storeValue: mutableSequences forKey: kPNPublishSequenceDataKey
302+ withCompletionBlock: ^(BOOL stored) { completion (); }];
303+ }];
304+ });
303305}
304306
305307- (void )cleanUpIfRequired {
306308
307309 NSTimeInterval currentTimestamp = [NSDate date ].timeIntervalSince1970 ;
308- OSSpinLockLock (&publishSequenceKeychainAccessLock);
309- [PNKeychain valueForKey: kPNPublishSequenceDataKey withCompletionBlock: ^(NSDictionary *sequences) {
310+ pn_lock_async (&publishSequenceKeychainAccessLock, ^(dispatch_block_t completion) {
310311
311- NSMutableDictionary *mutableSequences = [(sequences?: @{}) mutableCopy ];
312- [mutableSequences enumerateKeysAndObjectsUsingBlock: ^(NSString *publishKey, NSDictionary *sequenceData,
313- BOOL *sequencesEnumeratorStop) {
312+ [PNKeychain valueForKey: kPNPublishSequenceDataKey withCompletionBlock: ^(NSDictionary *sequences) {
314313
315- if (![publishKey isEqualToString: self .publishKey]) {
314+ NSMutableDictionary *mutableSequences = [(sequences?: @{}) mutableCopy ];
315+ [mutableSequences enumerateKeysAndObjectsUsingBlock: ^(NSString *publishKey,
316+ NSDictionary *sequenceData,
317+ BOOL *sequencesEnumeratorStop) {
316318
317- NSNumber *lastUpdateDate = sequenceData[PNPublishSequenceData.lastSaveDate];
318- NSTimeInterval lastUpdateTimestamp = lastUpdateDate.doubleValue ;
319- if (ABS (currentTimestamp - lastUpdateTimestamp) > kPNMaximumPublishSequenceDataAge ) {
319+ if (![publishKey isEqualToString: self .publishKey]) {
320320
321- mutableSequences[publishKey] = nil ;
321+ NSNumber *lastUpdateDate = sequenceData[PNPublishSequenceData.lastSaveDate];
322+ NSTimeInterval lastUpdateTimestamp = lastUpdateDate.doubleValue ;
323+ if (ABS (currentTimestamp - lastUpdateTimestamp) > kPNMaximumPublishSequenceDataAge ) {
324+
325+ mutableSequences[publishKey] = nil ;
326+ }
322327 }
323- }
328+ }];
329+
330+ [PNKeychain storeValue: mutableSequences forKey: kPNPublishSequenceDataKey
331+ withCompletionBlock: ^(BOOL stored) { completion (); }];
324332 }];
325-
326- [PNKeychain storeValue: mutableSequences forKey: kPNPublishSequenceDataKey
327- withCompletionBlock: ^(BOOL stored) { OSSpinLockUnlock (&publishSequenceKeychainAccessLock); }];
328- }];
333+ });
329334}
330335
331336
0 commit comments