From c8f545c753ec34924a90e4f15c28637e4395c68c Mon Sep 17 00:00:00 2001 From: Remi Hindriks <56312208+RemiHin@users.noreply.github.com> Date: Mon, 8 Jun 2026 20:03:08 +0200 Subject: [PATCH] fix(android): avoid holding initLock while calling into TextToSpeech to prevent ABBA deadlock --- .../main/java/com/speech/RNSpeechModule.kt | 21 +++++++++++-------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/android/src/main/java/com/speech/RNSpeechModule.kt b/android/src/main/java/com/speech/RNSpeechModule.kt index 5ac708d..fd1d535 100644 --- a/android/src/main/java/com/speech/RNSpeechModule.kt +++ b/android/src/main/java/com/speech/RNSpeechModule.kt @@ -361,24 +361,27 @@ class RNSpeechModule(reactContext: ReactApplicationContext) : } private fun ensureInitialized(promise: Promise, operation: () -> Unit) { - synchronized(initLock) { + val action: Int = synchronized(initLock) { when { - isInitialized -> { - try { - operation() - } catch (e: Exception) { - promise.reject("speech_error", e.message ?: "Unknown error") - } - } + isInitialized -> 0 isInitializing -> { pendingOperations.add(Pair(operation, promise)) + 1 } else -> { pendingOperations.add(Pair(operation, promise)) - initializeTTS() + 2 } } } + when (action) { + 0 -> try { + operation() + } catch (e: Exception) { + promise.reject("speech_error", e.message ?: "Unknown error") + } + 2 -> initializeTTS() + } } private fun applyGlobalOptions() {