diff --git a/Agent/Analytics/NRMAAnalytics.mm b/Agent/Analytics/NRMAAnalytics.mm index 16fa2c4f..52945748 100644 --- a/Agent/Analytics/NRMAAnalytics.mm +++ b/Agent/Analytics/NRMAAnalytics.mm @@ -115,7 +115,7 @@ - (id) initWithSessionStartTimeMS:(long long) sessionStartTime { PersistentEventStore *eventStore = [[PersistentEventStore alloc] initWithFilename:filename andMinimumDelay:.025]; - _eventManager = [[NRMAEventManager alloc] initWithPersistentStore:eventStore]; + _eventManager = [[NRMAEventManager alloc] initWithPersistentStore:[eventStore autorelease]]; _attributeValidator = [[NRMAAttributeValidator alloc] init]; _sessionAttributeManager = [[NRMASAM alloc] initWithAttributeValidator:_attributeValidator]; diff --git a/Agent/Analytics/NRMAEventManager.m b/Agent/Analytics/NRMAEventManager.m index 24fc6300..a8d74365 100644 --- a/Agent/Analytics/NRMAEventManager.m +++ b/Agent/Analytics/NRMAEventManager.m @@ -77,7 +77,7 @@ - (BOOL)didReachMaxQueueTime:(NSTimeInterval)currentTimeMilliseconds { } NSTimeInterval oldestEventAge = currentTimeMilliseconds - oldestEventTimestamp; - return (oldestEventAge / 1000) + kBufferTimeSecondsLeeway >= maxBufferTimeSeconds; + return (oldestEventAge / kDefaultBufferSize) + kBufferTimeSecondsLeeway >= maxBufferTimeSeconds; } - (NSUInteger)getEvictionIndex { diff --git a/Agent/Analytics/PersistentEventStore.m b/Agent/Analytics/PersistentEventStore.m index f2a331fe..e4916728 100644 --- a/Agent/Analytics/PersistentEventStore.m +++ b/Agent/Analytics/PersistentEventStore.m @@ -40,15 +40,34 @@ - (nonnull instancetype)initWithFilename:(NSString *)filename return self; } +- (void) dealloc { + if(self.pendingBlock){ + dispatch_block_cancel(self.pendingBlock); + } +} + - (void)performWrite:(void (^)(void))writeBlock { + __weak PersistentEventStore *weakSelf = self; dispatch_async(self.writeQueue, ^{ - if (self.pendingBlock != nil) { - dispatch_block_cancel(self.pendingBlock); + __strong PersistentEventStore *strongSelf = weakSelf; + if (!strongSelf) { // Ensure strongSelf is not nil + NRLOG_AGENT_WARNING(@"A block was scheduled but PersistentEventStore was deallocated before running"); + return; } - self.pendingBlock = dispatch_block_create(0, writeBlock); + if (strongSelf.pendingBlock != nil) { + dispatch_block_cancel(strongSelf.pendingBlock); + } + + strongSelf.pendingBlock = dispatch_block_create(0, writeBlock); - dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(self->_minimumDelay * NSEC_PER_SEC)), self->_writeQueue, self.pendingBlock); + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(strongSelf->_minimumDelay * NSEC_PER_SEC)), strongSelf->_writeQueue, ^{ + __strong PersistentEventStore *innerStrongSelf = weakSelf; + if (innerStrongSelf && innerStrongSelf.pendingBlock) { + innerStrongSelf.pendingBlock(); + innerStrongSelf.pendingBlock = nil; // Release the block after execution + } + }); }); }