@@ -4,21 +4,25 @@ import com.segment.analytics.kotlin.core.Analytics
4
4
import com.segment.analytics.kotlin.core.BaseEvent
5
5
import com.segment.analytics.kotlin.core.platform.plugins.logger.LogFilterKind
6
6
import com.segment.analytics.kotlin.core.platform.plugins.logger.segmentLog
7
+ import java.util.concurrent.CopyOnWriteArrayList
7
8
import kotlin.reflect.KClass
8
9
9
10
// Platform abstraction for managing plugins' execution (of a specific type)
10
- // All operations are thread safe via the `synchronized` function
11
- internal class Mediator (internal val plugins : MutableList <Plugin >) {
11
+ // All operations are thread safe via the CopyOnWriteArrayList. Which allows multiple
12
+ // threads to read the list but when a modification is made the modifier is given a new copy of
13
+ // list and that becomes the new version of the list.
14
+ // More info: https://developer.android.com/reference/kotlin/java/util/concurrent/CopyOnWriteArrayList
15
+ internal class Mediator (internal val plugins : CopyOnWriteArrayList <Plugin >) {
12
16
13
- fun add (plugin : Plugin ) = synchronized(plugins) {
17
+ fun add (plugin : Plugin ) {
14
18
plugins.add(plugin)
15
19
}
16
20
17
- fun remove (plugin : Plugin ) = synchronized(plugins) {
21
+ fun remove (plugin : Plugin ) {
18
22
plugins.removeAll { it == = plugin } // remove only if reference is the same
19
23
}
20
24
21
- fun execute (event : BaseEvent ): BaseEvent ? = synchronized(plugins) {
25
+ fun execute (event : BaseEvent ): BaseEvent ? {
22
26
var result: BaseEvent ? = event
23
27
24
28
plugins.forEach { plugin ->
@@ -42,13 +46,13 @@ internal class Mediator(internal val plugins: MutableList<Plugin>) {
42
46
return result
43
47
}
44
48
45
- fun applyClosure (closure : (Plugin ) -> Unit ) = synchronized(plugins) {
49
+ fun applyClosure (closure : (Plugin ) -> Unit ) {
46
50
plugins.forEach {
47
51
closure(it)
48
52
}
49
53
}
50
54
51
- fun <T : Plugin > find (pluginClass : KClass <T >): T ? = synchronized(plugins) {
55
+ fun <T : Plugin > find (pluginClass : KClass <T >): T ? {
52
56
plugins.forEach {
53
57
if (pluginClass.isInstance(it)) {
54
58
return it as T
@@ -57,7 +61,7 @@ internal class Mediator(internal val plugins: MutableList<Plugin>) {
57
61
return null
58
62
}
59
63
60
- fun <T : Plugin > findAll (pluginClass : KClass <T >): List <T > = synchronized(plugins) {
64
+ fun <T : Plugin > findAll (pluginClass : KClass <T >): List <T > {
61
65
return plugins.filter { pluginClass.isInstance(it) } as List <T >
62
66
}
63
67
}
0 commit comments