Skip to content

Commit bfeda76

Browse files
committed
Use OSCopyOnWriteSet for log listeners
* Use set instead of array to maintain the log listeners * Also, it is possible for someone to add or remove a log listener within the `onLogEvent` callback, thus modifying the set of listeners as the set is being enumerated. @synchronized is a recursive lock, so it would not be sufficient. Locking the entire set of listeners would result in deadlock. * This mimics the Android implementation which uses the built-in CopyOnWriteArraySet
1 parent 2959901 commit bfeda76

File tree

1 file changed

+10
-15
lines changed

1 file changed

+10
-15
lines changed

iOS_SDK/OneSignalSDK/OneSignalCore/Source/OneSignalLog.m

Lines changed: 10 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
#import <Foundation/Foundation.h>
2929
#import "OneSignalLog.h"
3030
#import "OSDialogInstanceManager.h"
31+
#import "OSCopyOnWriteSet.h"
3132

3233
@implementation OneSignalLogEvent
3334
- (instancetype)initWithLevel:(ONE_S_LOG_LEVEL)level entry:(NSString*)entry {
@@ -50,11 +51,11 @@ @implementation OneSignalLog
5051
return self;
5152
}
5253

53-
+ (NSMutableArray<NSObject<OSLogListener> *>*)logListeners {
54-
static NSMutableArray<NSObject<OSLogListener> *> *_logListeners;
54+
+ (OSCopyOnWriteSet<NSObject<OSLogListener> *>*)logListeners {
55+
static OSCopyOnWriteSet<NSObject<OSLogListener> *> *_logListeners;
5556
static dispatch_once_t onceToken;
5657
dispatch_once(&onceToken, ^{
57-
_logListeners = [NSMutableArray new];
58+
_logListeners = [OSCopyOnWriteSet new];
5859
});
5960
return _logListeners;
6061
}
@@ -68,15 +69,11 @@ + (void)setAlertLevel:(ONE_S_LOG_LEVEL)logLevel {
6869
}
6970

7071
+ (void)addLogListener:(NSObject<OSLogListener>*_Nonnull)listener {
71-
@synchronized(self.logListeners) {
72-
[self.logListeners addObject:listener];
73-
}
72+
[self.logListeners addObject:listener];
7473
}
7574

7675
+ (void)removeLogListener:(NSObject<OSLogListener>*_Nonnull)listener {
77-
@synchronized(self.logListeners) {
78-
[self.logListeners removeObject:listener];
79-
}
76+
[self.logListeners removeObject:listener];
8077
}
8178

8279
+ (void)_dump {}
@@ -122,12 +119,10 @@ void onesignal_Log(ONE_S_LOG_LEVEL logLevel, NSString* message) {
122119
[[OSDialogInstanceManager sharedInstance] presentDialogWithTitle:levelString withMessage:message withActions:nil cancelTitle:NSLocalizedString(@"Close", @"Close button") withActionCompletion:nil];
123120
}
124121

125-
@synchronized(OneSignalLog.logListeners) {
126-
for (NSObject<OSLogListener> *listener in OneSignalLog.logListeners) {
127-
if ([listener respondsToSelector:@selector(onLogEvent:)]) {
128-
OneSignalLogEvent *event = [[OneSignalLogEvent alloc] initWithLevel:logLevel entry:[levelString stringByAppendingString:message]];
129-
[listener onLogEvent:event];
130-
}
122+
for (NSObject<OSLogListener> *listener in OneSignalLog.logListeners.allObjects) {
123+
if ([listener respondsToSelector:@selector(onLogEvent:)]) {
124+
OneSignalLogEvent *event = [[OneSignalLogEvent alloc] initWithLevel:logLevel entry:[levelString stringByAppendingString:message]];
125+
[listener onLogEvent:event];
131126
}
132127
}
133128
}

0 commit comments

Comments
 (0)