From e1949893f297ab485e83a0ea80d3523d3c6cd82b Mon Sep 17 00:00:00 2001 From: Michael Kirk Date: Wed, 8 Feb 2017 18:17:24 -0500 Subject: [PATCH] Avoid deadlock when marking self-sent messages as read. Fetching the localNumber invokes another transaction, which can result in deadlock if called during an existing transaction. // FREEBIE --- src/Messages/TSMessagesManager.m | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/Messages/TSMessagesManager.m b/src/Messages/TSMessagesManager.m index 3c6d22185..d6736e686 100644 --- a/src/Messages/TSMessagesManager.m +++ b/src/Messages/TSMessagesManager.m @@ -560,6 +560,10 @@ NS_ASSUME_NONNULL_BEGIN __block TSIncomingMessage *_Nullable incomingMessage; __block TSThread *thread; + // Do this outside of a transaction to avoid deadlock + OWSAssert([TSAccountManager isRegistered]); + NSString *localNumber = [TSAccountManager localNumber]; + [self.dbConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { if (groupId) { NSMutableArray *uniqueMemberIds = [[[NSSet setWithArray:dataMessage.group.members] allObjects] mutableCopy]; @@ -634,8 +638,7 @@ NS_ASSUME_NONNULL_BEGIN // Any messages sent from the current user - from this device or another - should be // automatically marked as read. - OWSAssert([TSAccountManager isRegistered]); - BOOL shouldMarkMessageAsRead = [envelope.source isEqualToString:[TSAccountManager localNumber]]; + BOOL shouldMarkMessageAsRead = [envelope.source isEqualToString:localNumber]; if (shouldMarkMessageAsRead) { [incomingMessage markAsReadLocallyWithTransaction:transaction]; }