diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/UIDebuggerFlipperPlugin.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/UIDebuggerFlipperPlugin.kt index f725c80f7..b5a5a1d66 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/UIDebuggerFlipperPlugin.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/UIDebuggerFlipperPlugin.kt @@ -59,7 +59,7 @@ class UIDebuggerFlipperPlugin( MetadataUpdateEvent.name, Json.encodeToString( MetadataUpdateEvent.serializer(), - MetadataUpdateEvent(MetadataRegister.getPendingMetadata()))) + MetadataUpdateEvent(MetadataRegister.extractPendingMetadata()))) context.treeObserverManager.start() } diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/MetadataRegister.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/MetadataRegister.kt index 55a780b07..c8f772c51 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/MetadataRegister.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/MetadataRegister.kt @@ -23,9 +23,11 @@ object MetadataRegister { const val TYPE_LAYOUT = "layout" const val TYPE_DOCUMENTATION = "documentation" + private val lock = "lock" + private var generator: MetadataId = 0 private val register: MutableMap = mutableMapOf() - private val pending: MutableSet = mutableSetOf() + private val pendingKeys: MutableSet = mutableSetOf() private fun key(namespace: String, name: String): String = "${namespace}_$name" @@ -41,13 +43,15 @@ object MetadataRegister { return m.id } - val identifier = ++generator - val metadata = Metadata(identifier, type, namespace, name, mutable, possibleValues) + synchronized(lock) { + val identifier = ++generator + val metadata = Metadata(identifier, type, namespace, name, mutable, possibleValues) - register[key] = metadata - pending.add(key) + register[key] = metadata + pendingKeys.add(key) - return identifier + return identifier + } } fun get(namespace: String, name: String): Metadata? { @@ -55,24 +59,24 @@ object MetadataRegister { return register[key] } - fun getMetadata(): Map { - val metadata: MutableMap = mutableMapOf() - register.forEach { entry -> metadata[entry.value.id] = entry.value } + /** gets all pending metadata to be sent and resets the pending list */ + fun extractPendingMetadata(): Map { + synchronized(lock) { + val pendingMetadata: MutableMap = mutableMapOf() - return metadata - } + pendingKeys.forEach { key -> + register[key]?.let { metadata -> pendingMetadata[metadata.id] = metadata } + } + pendingKeys.clear() - fun getPendingMetadata(): Map { - val pendingMetadata: MutableMap = mutableMapOf() - pending.forEach { key -> - register[key]?.let { metadata -> pendingMetadata[metadata.id] = metadata } + return pendingMetadata } - - return pendingMetadata } fun reset() { - pending.clear() - register.forEach { entry -> pending.add(entry.key) } + synchronized(lock) { + pendingKeys.clear() + register.forEach { entry -> pendingKeys.add(entry.key) } + } } } diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/observers/TreeObserverManager.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/observers/TreeObserverManager.kt index 2c088011a..5c188e450 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/observers/TreeObserverManager.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/observers/TreeObserverManager.kt @@ -90,7 +90,7 @@ class TreeObserverManager(val context: Context) { } private fun sendMetadata() { - val metadata = MetadataRegister.getPendingMetadata() + val metadata = MetadataRegister.extractPendingMetadata() if (metadata.size > 0) { context.connectionRef.connection?.send( MetadataUpdateEvent.name,