From bfb5fac879a325f0b25726e9143b14379c6a09d3 Mon Sep 17 00:00:00 2001 From: Matthew Chen Date: Fri, 15 Sep 2017 10:16:52 -0400 Subject: [PATCH] Make "database view registration complete" check thread-safe. // FREEBIE --- SignalServiceKit/src/Storage/TSDatabaseView.h | 1 + SignalServiceKit/src/Storage/TSDatabaseView.m | 23 ++++++++++++++++--- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/SignalServiceKit/src/Storage/TSDatabaseView.h b/SignalServiceKit/src/Storage/TSDatabaseView.h index 921b36ede..505696b43 100644 --- a/SignalServiceKit/src/Storage/TSDatabaseView.h +++ b/SignalServiceKit/src/Storage/TSDatabaseView.h @@ -23,6 +23,7 @@ extern NSString *const TSSecondaryDevicesDatabaseViewExtensionName; - (instancetype)init NS_UNAVAILABLE; +// This method can be called from any thread. + (BOOL)hasPendingViewRegistrations; // This method must be called _AFTER_ registerThreadInteractionsDatabaseView. diff --git a/SignalServiceKit/src/Storage/TSDatabaseView.m b/SignalServiceKit/src/Storage/TSDatabaseView.m index 35ed412d5..5ef98df25 100644 --- a/SignalServiceKit/src/Storage/TSDatabaseView.m +++ b/SignalServiceKit/src/Storage/TSDatabaseView.m @@ -64,13 +64,29 @@ NSString *const TSSecondaryDevicesDatabaseViewExtensionName = @"TSSecondaryDevic return self; } -+ (BOOL)hasPendingViewRegistrations +- (BOOL)hasPendingViewRegistrations { - OWSAssert([NSThread isMainThread]); + @synchronized(self) + { + return !self.areAllAsyncRegistrationsComplete; + } +} ++ (BOOL)hasPendingViewRegistrations +{ return ![TSDatabaseView sharedInstance].areAllAsyncRegistrationsComplete; } +- (void)setAreAllAsyncRegistrationsComplete +{ + @synchronized(self) + { + OWSAssert(!self.areAllAsyncRegistrationsComplete); + + self.areAllAsyncRegistrationsComplete = YES; + } +} + + (void)registerMessageDatabaseViewWithName:(NSString *)viewName viewGrouping:(YapDatabaseViewGrouping *)viewGrouping version:(NSString *)version @@ -423,8 +439,9 @@ NSString *const TSSecondaryDevicesDatabaseViewExtensionName = @"TSSecondaryDevic // All async registrations are complete when writes are unblocked. [[TSStorageManager sharedManager].newDatabaseConnection asyncReadWriteWithBlock:^(YapDatabaseReadWriteTransaction *_Nonnull transaction) { + [TSDatabaseView.sharedInstance setAreAllAsyncRegistrationsComplete]; + dispatch_async(dispatch_get_main_queue(), ^{ - TSDatabaseView.sharedInstance.areAllAsyncRegistrationsComplete = YES; [[NSNotificationCenter defaultCenter] postNotificationName:kNSNotificationName_DatabaseViewRegistrationComplete object:nil