File tree Expand file tree Collapse file tree 2 files changed +54
-4
lines changed
OneSignalSDK/onesignal/core/src
main/java/com/onesignal/common/events
test/java/com/onesignal/common Expand file tree Collapse file tree 2 files changed +54
-4
lines changed Original file line number Diff line number Diff line change @@ -45,7 +45,7 @@ open class EventProducer<THandler> : IEventNotifier<THandler> {
45
45
* @param callback The callback will be invoked for each subscribed handler, allowing you to call the handler.
46
46
*/
47
47
fun fire (callback : (THandler ) -> Unit ) {
48
- val localList = subscribers.toList()
48
+ val localList = synchronized( subscribers) { subscribers .toList() }
49
49
for (s in localList) {
50
50
callback(s)
51
51
}
@@ -60,7 +60,7 @@ open class EventProducer<THandler> : IEventNotifier<THandler> {
60
60
*/
61
61
fun fireOnMain (callback : (THandler ) -> Unit ) {
62
62
suspendifyOnMain {
63
- val localList = subscribers.toList()
63
+ val localList = synchronized( subscribers) { subscribers .toList() }
64
64
for (s in localList) {
65
65
callback(s)
66
66
}
@@ -74,7 +74,7 @@ open class EventProducer<THandler> : IEventNotifier<THandler> {
74
74
* @param callback The callback will be invoked for each subscribed handler, allowing you to call the handler.
75
75
*/
76
76
suspend fun suspendingFire (callback : suspend (THandler ) -> Unit ) {
77
- val localList = subscribers.toList()
77
+ val localList = synchronized( subscribers) { subscribers .toList() }
78
78
for (s in localList) {
79
79
callback(s)
80
80
}
@@ -88,7 +88,7 @@ open class EventProducer<THandler> : IEventNotifier<THandler> {
88
88
*/
89
89
suspend fun suspendingFireOnMain (callback : suspend (THandler ) -> Unit ) {
90
90
withContext(Dispatchers .Main ) {
91
- val localList = subscribers.toList()
91
+ val localList = synchronized( subscribers) { subscribers .toList() }
92
92
for (s in localList) {
93
93
callback(s)
94
94
}
Original file line number Diff line number Diff line change
1
+ package com.onesignal.common
2
+
3
+ import com.onesignal.common.events.EventProducer
4
+ import io.kotest.core.spec.style.FunSpec
5
+ import kotlin.concurrent.thread
6
+
7
+ class EventProducerTest : FunSpec ({
8
+
9
+ fun modifyingSubscribersThread(eventProducer: EventProducer <Boolean >): Thread {
10
+ return thread(start = true) {
11
+ repeat(10_000) {
12
+ eventProducer.subscribe(true)
13
+ eventProducer.unsubscribe(true)
14
+ }
15
+ }
16
+ }
17
+
18
+ test("fire is thread safe") {
19
+ val eventProducer = EventProducer <Boolean >()
20
+ val modifyingSubscribersThread = modifyingSubscribersThread(eventProducer)
21
+
22
+ repeat(10_000) {
23
+ eventProducer.fire { }
24
+ }
25
+
26
+ modifyingSubscribersThread.join()
27
+ }
28
+
29
+ test("suspendingFire is thread safe") {
30
+ val eventProducer = EventProducer <Boolean >()
31
+ val modifyingSubscribersThread = modifyingSubscribersThread(eventProducer)
32
+
33
+ repeat(10_000) {
34
+ eventProducer.suspendingFire { }
35
+ }
36
+
37
+ modifyingSubscribersThread.join()
38
+ }
39
+
40
+ test("hasSubscribers is thread safe") {
41
+ val eventProducer = EventProducer <Boolean >()
42
+ val modifyingSubscribersThread = modifyingSubscribersThread(eventProducer)
43
+
44
+ repeat(10_000) {
45
+ eventProducer.hasSubscribers
46
+ }
47
+
48
+ modifyingSubscribersThread.join()
49
+ }
50
+ })
You can’t perform that action at this time.
0 commit comments