@@ -124,6 +124,9 @@ static std::string* g_lockfile_path;
124124
125125static Mutex* g_file_locker_mutex;
126126
127+ // Mutex for managing if FutureData is safe to use, or if it has been deleted.
128+ static Mutex g_future_data_mutex;
129+
127130static const char * kMessagingNotInitializedError = " Messaging not initialized." ;
128131
129132static void HandlePendingSubscriptions ();
@@ -706,7 +709,10 @@ void Terminate() {
706709 SetListener (nullptr );
707710 ReleaseClasses (env);
708711 util::Terminate (env);
709- FutureData::Destroy ();
712+ {
713+ MutexLock lock (g_future_data_mutex);
714+ FutureData::Destroy ();
715+ }
710716}
711717
712718// Start a service which will communicate with the Firebase Cloud Messaging
@@ -826,8 +832,13 @@ static void CompleteVoidCallback(JNIEnv* env, jobject result,
826832 FutureHandle handle (future_id);
827833 Error error =
828834 (result_code == util::kFutureResultSuccess ) ? kErrorNone : kErrorUnknown ;
829- ReferenceCountedFutureImpl* api = FutureData::Get ()->api ();
830- api->Complete (handle, error, status_message);
835+ MutexLock lock (g_future_data_mutex);
836+ if (FutureData::Get () && FutureData::Get ()->api ()) {
837+ ReferenceCountedFutureImpl* api = FutureData::Get ()->api ();
838+ api->Complete (handle, error, status_message);
839+ } else {
840+ LogWarning (" Failed to complete Future as it was likely already deleted." );
841+ }
831842 if (result) env->DeleteLocalRef (result);
832843}
833844
@@ -843,8 +854,13 @@ static void CompleteStringCallback(JNIEnv* env, jobject result,
843854 SafeFutureHandle<std::string>* handle =
844855 reinterpret_cast <SafeFutureHandle<std::string>*>(callback_data);
845856 Error error = success ? kErrorNone : kErrorUnknown ;
846- ReferenceCountedFutureImpl* api = FutureData::Get ()->api ();
847- api->CompleteWithResult (*handle, error, status_message, result_value);
857+ MutexLock lock (g_future_data_mutex);
858+ if (FutureData::Get () && FutureData::Get ()->api ()) {
859+ ReferenceCountedFutureImpl* api = FutureData::Get ()->api ();
860+ api->CompleteWithResult (*handle, error, status_message, result_value);
861+ } else {
862+ LogWarning (" Failed to complete Future as it was likely already deleted." );
863+ }
848864 delete handle;
849865}
850866
0 commit comments