diff --git a/app/src_java/com/google/firebase/app/internal/cpp/JniResultCallback.java b/app/src_java/com/google/firebase/app/internal/cpp/JniResultCallback.java index 954957e50d..59ddd15b66 100644 --- a/app/src_java/com/google/firebase/app/internal/cpp/JniResultCallback.java +++ b/app/src_java/com/google/firebase/app/internal/cpp/JniResultCallback.java @@ -45,6 +45,10 @@ private interface Callback { public static final String TAG = "FirebaseCb"; + // Object used to synchronize around. All synchronization should be done with this, + // as there isn't a guarantee on which function will be called first. + private final Object lockObject = new Object(); + /** * This class is registered with a Task object as an OnSuccessListener, OnFailureListener, and * OnCanceledListener, redirecting completion status to the C++ method nativeOnResult. @@ -52,7 +56,6 @@ private interface Callback { private class TaskCallback implements OnSuccessListener, OnFailureListener, OnCanceledListener, Callback { private Task task; - private final Object lockObject = new Object(); /** * Register with a Task instance to capture the completion callback. */ @@ -129,7 +132,7 @@ protected void initializeNativeCallbackFunctionAndData(long callbackFn, long cal /** Initialize / attach the instance to a pending result or task object. */ protected void initializeWithTask(Task task) { - synchronized (this) { + synchronized (lockObject) { callbackHandler = new TaskCallback(task); callbackHandler.register(); } @@ -146,7 +149,7 @@ public void cancel() { /** Call nativeOnResult with the registered callbackFn and callbackData. */ public void onCompletion( Object result, boolean success, boolean cancelled, String statusMessage) { - synchronized (this) { + synchronized (lockObject) { if (callbackHandler != null) { nativeOnResult(result, success, cancelled, statusMessage, callbackFn, callbackData); callbackHandler.disconnect(); diff --git a/release_build_files/readme.md b/release_build_files/readme.md index b35ddaf9bb..cc87ed81c7 100644 --- a/release_build_files/readme.md +++ b/release_build_files/readme.md @@ -629,6 +629,8 @@ code. ## Release Notes ### Upcoming Release - Changes + - General (Android): Fix for deadlock within JniResultCallback, commonly + seen within Messaging, but affecting other products as well. - Database/Firestore (Desktop): Fixed a crash on Windows when the user's home directory contains non-ANSI characters (Unicode above U+00FF). - Storage (Desktop): Fixed a crash on Windows when uploading files from a