diff --git a/cpp/JNIOnLoad.cpp b/cpp/JNIOnLoad.cpp index 4e86c6d9c..ac539c462 100644 --- a/cpp/JNIOnLoad.cpp +++ b/cpp/JNIOnLoad.cpp @@ -99,7 +99,7 @@ static void clearAllProviders(JNIEnv* env, jobject cls) { TraceProviders::get().clearAllProviders(); } -static void initProviderNames( +static void refreshProviderNames( fbjni::alias_ref cls, fbjni::alias_ref provider_ids, fbjni::alias_ref> provider_names) { @@ -133,7 +133,7 @@ JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void*) { makeNativeMethod( "nativeClearAllProviders", profilo::clearAllProviders), makeNativeMethod( - "nativeInitProviderNames", profilo::initProviderNames), + "nativeRefreshProviderNames", profilo::refreshProviderNames), }); fbjni::registerNatives( diff --git a/java/main/com/facebook/profilo/core/BUCK b/java/main/com/facebook/profilo/core/BUCK index b730e2d83..4e8347249 100644 --- a/java/main/com/facebook/profilo/core/BUCK +++ b/java/main/com/facebook/profilo/core/BUCK @@ -71,6 +71,7 @@ fb_core_android_library( ], exported_deps = [ ":constants", + ":registry", ], ) diff --git a/java/main/com/facebook/profilo/core/CoreTraceListener.java b/java/main/com/facebook/profilo/core/CoreTraceListener.java index 4fb42d016..001379993 100644 --- a/java/main/com/facebook/profilo/core/CoreTraceListener.java +++ b/java/main/com/facebook/profilo/core/CoreTraceListener.java @@ -14,10 +14,7 @@ package com.facebook.profilo.core; import com.facebook.profilo.entries.EntryType; -import com.facebook.profilo.ipc.TraceContext; import com.facebook.profilo.logger.Logger; -import java.util.HashMap; -import java.util.List; import java.util.Set; class CoreTraceListener extends DefaultTraceOrchestratorListener { @@ -96,18 +93,4 @@ public void onProvidersStop(int activeProviders) { addTraceAnnotation( Identifiers.ACTIVE_PROVIDERS, "Active providers", activeProvidersStr.toString()); } - - @Override - public void onTraceStart(TraceContext context) { - if (TraceEvents.isProviderNamesInitialized()) { - return; - } - // Initialize provider names - List registeredProviders = ProvidersRegistry.getRegisteredProviders(); - HashMap providerNamesMap = new HashMap<>(registeredProviders.size()); - for (String providerName : registeredProviders) { - providerNamesMap.put(providerName, ProvidersRegistry.getBitMaskFor(providerName)); - } - TraceEvents.initProviderNames(providerNamesMap); - } } diff --git a/java/main/com/facebook/profilo/core/ProvidersRegistry.java b/java/main/com/facebook/profilo/core/ProvidersRegistry.java index 8a740db6d..2f0dc154d 100644 --- a/java/main/com/facebook/profilo/core/ProvidersRegistry.java +++ b/java/main/com/facebook/profilo/core/ProvidersRegistry.java @@ -69,4 +69,8 @@ public static List getRegisteredProviders() { public static Set getRegisteredProvidersByBitMask(int bitMask) { return sRegistry.getRegisteredEntriesByBitMask(bitMask); } + + public static int getBitmaskForAllEntries() { + return sRegistry.getBitMaskForAllEntries(); + } } diff --git a/java/main/com/facebook/profilo/core/TraceEvents.java b/java/main/com/facebook/profilo/core/TraceEvents.java index 636190bd1..ec02fba0d 100644 --- a/java/main/com/facebook/profilo/core/TraceEvents.java +++ b/java/main/com/facebook/profilo/core/TraceEvents.java @@ -13,7 +13,7 @@ */ package com.facebook.profilo.core; -import java.util.Map; +import java.util.List; /** Responsible for managing the currently allowed trace providers. */ public final class TraceEvents { @@ -24,7 +24,7 @@ public final class TraceEvents { */ public static boolean sInitialized; - private static volatile boolean sProviderNamesInitialized; + private static int sLastNameRefreshProvidersState; private static volatile int sProviders = 0; public static boolean isEnabled(int provider) { @@ -35,40 +35,41 @@ public static int enabledMask(int providers) { return sProviders & providers; } - public static boolean isProviderNamesInitialized() { - return sProviderNamesInitialized; + public static synchronized void enableProviders(int providers) { + sProviders = nativeEnableProviders(providers); } - public static void initProviderNames(Map providerNamesMap) { + public static synchronized void disableProviders(int providers) { + sProviders = nativeDisableProviders(providers); + } + + public static synchronized void clearAllProviders() { + nativeClearAllProviders(); + sProviders = 0; + } + + public static synchronized void refreshProviderNames() { if (!sInitialized) { throw new IllegalStateException("Native library is not initialized."); } - if (sProviderNamesInitialized) { + int currentBitmaskForAllEntries = ProvidersRegistry.getBitmaskForAllEntries(); + if (currentBitmaskForAllEntries == sLastNameRefreshProvidersState) { return; } - int size = providerNamesMap.size(); + sLastNameRefreshProvidersState = currentBitmaskForAllEntries; + + List registeredProviders = ProvidersRegistry.getRegisteredProviders(); + int size = registeredProviders.size(); int[] providerIds = new int[size]; String[] providerNames = new String[size]; + int i = 0; - for (Map.Entry nextProvider : providerNamesMap.entrySet()) { - providerNames[i] = nextProvider.getKey(); - providerIds[i++] = nextProvider.getValue(); + for (String nextProvider : registeredProviders) { + providerNames[i] = nextProvider; + providerIds[i++] = ProvidersRegistry.getBitMaskFor(nextProvider); } - nativeInitProviderNames(providerIds, providerNames); - sProviderNamesInitialized = true; - } - - public static synchronized void enableProviders(int providers) { - sProviders = nativeEnableProviders(providers); - } - - public static synchronized void disableProviders(int providers) { - sProviders = nativeDisableProviders(providers); - } - public static synchronized void clearAllProviders() { - nativeClearAllProviders(); - sProviders = 0; + nativeRefreshProviderNames(providerIds, providerNames); } static native int nativeEnableProviders(int providers); @@ -77,5 +78,5 @@ public static synchronized void clearAllProviders() { static native void nativeClearAllProviders(); - static native void nativeInitProviderNames(int[] providerIds, String[] providerNames); + static native void nativeRefreshProviderNames(int[] providerIds, String[] providerNames); } diff --git a/java/main/com/facebook/profilo/core/TraceOrchestrator.java b/java/main/com/facebook/profilo/core/TraceOrchestrator.java index 0d7018c08..c15be784c 100644 --- a/java/main/com/facebook/profilo/core/TraceOrchestrator.java +++ b/java/main/com/facebook/profilo/core/TraceOrchestrator.java @@ -374,6 +374,7 @@ private void performConfigTransition(Config newConfig) { */ @Override public void onTraceStartSync(TraceContext context) { + TraceEvents.refreshProviderNames(); // Increment the providers TraceEvents.enableProviders(context.enabledProviders);