From 952922e1530c856033921396ec242d449e2fdcfc Mon Sep 17 00:00:00 2001 From: Shi Su Date: Wed, 24 Sep 2025 19:14:27 -0700 Subject: [PATCH 1/3] Guard video client stop with a mutex --- .../internal/video/DefaultVideoClientController.kt | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/internal/video/DefaultVideoClientController.kt b/amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/internal/video/DefaultVideoClientController.kt index 3342f354..2573d445 100644 --- a/amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/internal/video/DefaultVideoClientController.kt +++ b/amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/internal/video/DefaultVideoClientController.kt @@ -34,6 +34,8 @@ import com.xodee.client.video.VideoSubscriptionConfigurationInternal import java.security.InvalidParameterException import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.launch +import kotlinx.coroutines.sync.Mutex +import kotlinx.coroutines.sync.withLock class DefaultVideoClientController( private val context: Context, @@ -64,7 +66,7 @@ class DefaultVideoClientController( private val cameraCaptureSource: DefaultCameraCaptureSource private var videoSourceAdapter = VideoSourceAdapter() private var isUsingInternalCaptureSource = false - + private val videoClientStopMutex = Mutex() init { videoClientStateController.bindLifecycleHandler(this) @@ -100,10 +102,12 @@ class DefaultVideoClientController( // So it doesn't call it spuriously videoClientObserver.primaryMeetingPromotionObserver = null - videoClientStateController.stop() + videoClientStopMutex.withLock { + videoClientStateController.stop() - eglCore?.release() - eglCore = null + eglCore?.release() + eglCore = null + } } } From abfb4d04ab20d332e04b297bba4164a8e13cb9d2 Mon Sep 17 00:00:00 2001 From: Shi Su Date: Thu, 2 Oct 2025 12:21:48 -0700 Subject: [PATCH 2/3] Update change log --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index a559838e..8499bfee 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ ### Added * Added following meeting events: meetingReconnected/audioInputFailed/videoClientSignalingDropped/contentShareSignalingDropped/appStateChanged/appMemoryLow/contentShareStartRequested/contentShareStarted/contentShareStopped/contentShareFailed/voiceFocusEnabled/voiceFocusDisabled/voiceFocusEnableFailed/voiceFocusDisableFailed/videoCaptureSessionInterruptionBegan/videoCaptureSessionInterruptionEnded * Added following meeting event attributes: meetingReconnectDurationMs/audioInputErrorMessage/signalingDroppedErrorMessage/appState/batteryLevel/batteryState/contentShareErrorMessage/voiceFocusErrorMessage/lowPowerModeEnabled +* Guard video client stop with a mutex ## [0.25.0] - 2025-06-17 From 62b937cbebda8cf6406d1c7f792dd385b1ca44d7 Mon Sep 17 00:00:00 2001 From: Shi Su Date: Fri, 3 Oct 2025 10:45:27 -0700 Subject: [PATCH 3/3] Add comment --- .../meetings/internal/video/DefaultVideoClientController.kt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/internal/video/DefaultVideoClientController.kt b/amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/internal/video/DefaultVideoClientController.kt index 2573d445..09fe8045 100644 --- a/amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/internal/video/DefaultVideoClientController.kt +++ b/amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/internal/video/DefaultVideoClientController.kt @@ -103,8 +103,12 @@ class DefaultVideoClientController( videoClientObserver.primaryMeetingPromotionObserver = null videoClientStopMutex.withLock { + // Race conditions in video client stop functions may lead to crashes at pointer deallocation + // if multiple such threads are called at the same time. videoClientStateController.stop() + // We put release eglCore under mutex as a race condition may decrease its reference counter + // below 0 and cause crashes if multiple such calls happen together. eglCore?.release() eglCore = null }