|
|
@ -186,6 +186,7 @@ NSString *const OWSMessageProcessingJobFinderExtensionGroup = @"OWSMessageProces
|
|
|
|
|
|
|
|
|
|
|
|
@property (nonatomic, readonly) TSMessagesManager *messagesManager;
|
|
|
|
@property (nonatomic, readonly) TSMessagesManager *messagesManager;
|
|
|
|
@property (nonatomic, readonly) OWSMessageProcessingJobFinder *finder;
|
|
|
|
@property (nonatomic, readonly) OWSMessageProcessingJobFinder *finder;
|
|
|
|
|
|
|
|
@property (nonatomic) BOOL isDrainingQueue;
|
|
|
|
|
|
|
|
|
|
|
|
- (instancetype)initWithMessagesManager:(TSMessagesManager *)messagesManager
|
|
|
|
- (instancetype)initWithMessagesManager:(TSMessagesManager *)messagesManager
|
|
|
|
finder:(OWSMessageProcessingJobFinder *)finder NS_DESIGNATED_INITIALIZER;
|
|
|
|
finder:(OWSMessageProcessingJobFinder *)finder NS_DESIGNATED_INITIALIZER;
|
|
|
@ -207,6 +208,7 @@ NSString *const OWSMessageProcessingJobFinderExtensionGroup = @"OWSMessageProces
|
|
|
|
|
|
|
|
|
|
|
|
_messagesManager = messagesManager;
|
|
|
|
_messagesManager = messagesManager;
|
|
|
|
_finder = finder;
|
|
|
|
_finder = finder;
|
|
|
|
|
|
|
|
_isDrainingQueue = NO;
|
|
|
|
|
|
|
|
|
|
|
|
return self;
|
|
|
|
return self;
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -220,41 +222,43 @@ NSString *const OWSMessageProcessingJobFinderExtensionGroup = @"OWSMessageProces
|
|
|
|
|
|
|
|
|
|
|
|
- (void)drainQueue
|
|
|
|
- (void)drainQueue
|
|
|
|
{
|
|
|
|
{
|
|
|
|
dispatch_async(self.class.serialGCDQueue, ^{
|
|
|
|
AssertIsOnMainThread();
|
|
|
|
OWSMessageProcessingJob *_Nullable job = [self.finder nextJob];
|
|
|
|
|
|
|
|
if (job == nil) {
|
|
|
|
if (self.isDrainingQueue) {
|
|
|
|
DDLogVerbose(@"%@ Queue is drained", self.tag);
|
|
|
|
return;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
self.isDrainingQueue = YES;
|
|
|
|
|
|
|
|
|
|
|
|
[self processJob:job
|
|
|
|
[self drainQueueWorkStep];
|
|
|
|
completion:^{
|
|
|
|
|
|
|
|
[self drainQueue];
|
|
|
|
|
|
|
|
}];
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
- (void)processJob:(OWSMessageProcessingJob *)job completion:(void (^)())completion
|
|
|
|
- (void)drainQueueWorkStep
|
|
|
|
{
|
|
|
|
{
|
|
|
|
dispatch_async(dispatch_get_main_queue(), ^{
|
|
|
|
AssertIsOnMainThread();
|
|
|
|
[self.messagesManager processEnvelope:job.envelopeProto
|
|
|
|
|
|
|
|
completion:^{
|
|
|
|
OWSMessageProcessingJob *_Nullable job = [self.finder nextJob];
|
|
|
|
[self.finder removeJobWithId:job.uniqueId];
|
|
|
|
if (job == nil) {
|
|
|
|
completion();
|
|
|
|
self.isDrainingQueue = NO;
|
|
|
|
}];
|
|
|
|
DDLogVerbose(@"%@ Queue is drained", self.tag);
|
|
|
|
});
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#pragma mark Helpers
|
|
|
|
[self processJob:job
|
|
|
|
|
|
|
|
completion:^{
|
|
|
|
|
|
|
|
DDLogVerbose(@"%@ completed job. %lu jobs left.",
|
|
|
|
|
|
|
|
self.tag,
|
|
|
|
|
|
|
|
(unsigned long)[OWSMessageProcessingJob numberOfKeysInCollection]);
|
|
|
|
|
|
|
|
[self drainQueueWorkStep];
|
|
|
|
|
|
|
|
}];
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
+ (dispatch_queue_t)serialGCDQueue
|
|
|
|
- (void)processJob:(OWSMessageProcessingJob *)job completion:(void (^)())completion
|
|
|
|
{
|
|
|
|
{
|
|
|
|
static dispatch_once_t onceToken;
|
|
|
|
[self.messagesManager processEnvelope:job.envelopeProto
|
|
|
|
static dispatch_queue_t queue;
|
|
|
|
completion:^{
|
|
|
|
dispatch_once(&onceToken, ^{
|
|
|
|
[self.finder removeJobWithId:job.uniqueId];
|
|
|
|
queue = dispatch_queue_create("org.whispersystems.signal.messageProcessingQueue", NULL);
|
|
|
|
completion();
|
|
|
|
});
|
|
|
|
}];
|
|
|
|
return queue;
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#pragma mark Logging
|
|
|
|
#pragma mark Logging
|
|
|
@ -331,6 +335,13 @@ NSString *const OWSMessageProcessingJobFinderExtensionGroup = @"OWSMessageProces
|
|
|
|
|
|
|
|
|
|
|
|
#pragma mark - instance methods
|
|
|
|
#pragma mark - instance methods
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- (void)handleAnyUnprocessedEnvelopesAsync
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
dispatch_async(dispatch_get_main_queue(), ^{
|
|
|
|
|
|
|
|
[self.processingQueue drainQueue];
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
- (void)handleReceivedEnvelope:(OWSSignalServiceProtosEnvelope *)envelope
|
|
|
|
- (void)handleReceivedEnvelope:(OWSSignalServiceProtosEnvelope *)envelope
|
|
|
|
{
|
|
|
|
{
|
|
|
|
// Drop any too-large messages on the floor. Well behaving clients should never send them.
|
|
|
|
// Drop any too-large messages on the floor. Well behaving clients should never send them.
|
|
|
|