Avoid deadlock

There are multiple methods which synchronize(self) in TSAccountMessage and also
multiple ones which can occur within a read-write transaction.
pull/2/head
Michael Kirk 7 years ago
parent b374955f80
commit b55e0e45f5

@ -259,21 +259,23 @@ NSString *const TSAccountManager_NeedsAccountAttributesUpdateKey = @"TSAccountMa
- (uint32_t)getOrGenerateRegistrationId:(YapDatabaseReadWriteTransaction *)transaction - (uint32_t)getOrGenerateRegistrationId:(YapDatabaseReadWriteTransaction *)transaction
{ {
@synchronized(self) // Unlike other methods in this class, there's no need for a `@synchronized` block
{ // here, since we're already in a write transaction, and all writes occur on a serial queue.
uint32_t registrationID = [[transaction objectForKey:TSAccountManager_LocalRegistrationIdKey //
inCollection:TSAccountManager_UserAccountCollection] unsignedIntValue]; // Since other code in this class which uses @synchronized(self) also needs to open write
// transaction, using @synchronized(self) here, inside of a WriteTransaction risks deadlock.
if (registrationID == 0) { uint32_t registrationID = [[transaction objectForKey:TSAccountManager_LocalRegistrationIdKey
registrationID = (uint32_t)arc4random_uniform(16380) + 1; inCollection:TSAccountManager_UserAccountCollection] unsignedIntValue];
OWSLogWarn(@"Generated a new registrationID: %u", registrationID);
if (registrationID == 0) {
[transaction setObject:[NSNumber numberWithUnsignedInteger:registrationID] registrationID = (uint32_t)arc4random_uniform(16380) + 1;
forKey:TSAccountManager_LocalRegistrationIdKey OWSLogWarn(@"Generated a new registrationID: %u", registrationID);
inCollection:TSAccountManager_UserAccountCollection];
} [transaction setObject:[NSNumber numberWithUnsignedInteger:registrationID]
return registrationID; forKey:TSAccountManager_LocalRegistrationIdKey
inCollection:TSAccountManager_UserAccountCollection];
} }
return registrationID;
} }
- (void)registerForPushNotificationsWithPushToken:(NSString *)pushToken - (void)registerForPushNotificationsWithPushToken:(NSString *)pushToken

Loading…
Cancel
Save