Skip to content

Commit cc3252a

Browse files
committed
Make the wrapper function explicitly a c extern
Also make sure nothing strange is happening with concurrency
1 parent e6c75ca commit cc3252a

File tree

1 file changed

+16
-7
lines changed

1 file changed

+16
-7
lines changed

analytics/src/analytics_desktop.cc

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -411,13 +411,20 @@ LogLevel ConvertAnalyticsLogLevelToFirebaseLogLevel(
411411
}
412412
}
413413

414-
// C-style callback that will be passed to the Google Analytics C API.
415-
static void GoogleAnalyticsWraperLogCallback(GoogleAnalytics_LogLevel log_level,
416-
const char* message) {
417-
if (g_log_callback) {
414+
415+
extern "C" void GoogleAnalyticsWrapperLogCallback(
416+
GoogleAnalytics_LogLevel log_level, const char* message) {
417+
LogCallback callback_to_call;
418+
419+
{
420+
std::lock_guard<std::mutex> lock(g_log_callback_mutex);
421+
callback_to_call = g_log_callback;
422+
}
423+
424+
if (callback_to_call) {
418425
LogLevel firebase_log_level =
419426
ConvertAnalyticsLogLevelToFirebaseLogLevel(log_level);
420-
g_log_callback(firebase_log_level, message);
427+
callback_to_call(firebase_log_level, message);
421428
}
422429
}
423430

@@ -426,8 +433,10 @@ static void GoogleAnalyticsWraperLogCallback(GoogleAnalytics_LogLevel log_level,
426433
void SetLogCallback(const LogCallback& callback) {
427434
FIREBASE_ASSERT_RETURN_VOID(internal::IsInitialized());
428435
// The C API does not support user data, so we must use a global variable.
429-
std::lock_guard<std::mutex> lock(g_log_callback_mutex);
430-
g_log_callback = callback;
436+
{
437+
std::lock_guard<std::mutex> lock(g_log_callback_mutex);
438+
g_log_callback = callback;
439+
}
431440
GoogleAnalytics_SetLogCallback(GoogleAnalyticsWraperLogCallback);
432441
}
433442

0 commit comments

Comments
 (0)