@@ -4,21 +4,25 @@ import com.segment.analytics.kotlin.core.Analytics
44import com.segment.analytics.kotlin.core.BaseEvent
55import com.segment.analytics.kotlin.core.platform.plugins.logger.LogFilterKind
66import com.segment.analytics.kotlin.core.platform.plugins.logger.segmentLog
7+ import java.util.concurrent.CopyOnWriteArrayList
78import kotlin.reflect.KClass
89
910// 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 >) {
1216
13- fun add (plugin : Plugin ) = synchronized(plugins) {
17+ fun add (plugin : Plugin ) {
1418 plugins.add(plugin)
1519 }
1620
17- fun remove (plugin : Plugin ) = synchronized(plugins) {
21+ fun remove (plugin : Plugin ) {
1822 plugins.removeAll { it == = plugin } // remove only if reference is the same
1923 }
2024
21- fun execute (event : BaseEvent ): BaseEvent ? = synchronized(plugins) {
25+ fun execute (event : BaseEvent ): BaseEvent ? {
2226 var result: BaseEvent ? = event
2327
2428 plugins.forEach { plugin ->
@@ -42,13 +46,13 @@ internal class Mediator(internal val plugins: MutableList<Plugin>) {
4246 return result
4347 }
4448
45- fun applyClosure (closure : (Plugin ) -> Unit ) = synchronized(plugins) {
49+ fun applyClosure (closure : (Plugin ) -> Unit ) {
4650 plugins.forEach {
4751 closure(it)
4852 }
4953 }
5054
51- fun <T : Plugin > find (pluginClass : KClass <T >): T ? = synchronized(plugins) {
55+ fun <T : Plugin > find (pluginClass : KClass <T >): T ? {
5256 plugins.forEach {
5357 if (pluginClass.isInstance(it)) {
5458 return it as T
@@ -57,7 +61,7 @@ internal class Mediator(internal val plugins: MutableList<Plugin>) {
5761 return null
5862 }
5963
60- fun <T : Plugin > findAll (pluginClass : KClass <T >): List <T > = synchronized(plugins) {
64+ fun <T : Plugin > findAll (pluginClass : KClass <T >): List <T > {
6165 return plugins.filter { pluginClass.isInstance(it) } as List <T >
6266 }
6367}
0 commit comments