Instrument TurboModuleManager.getModule

Summary:
This instruments the following marker:
- MODULE_CREATE

**Note:** This marker isn't necessary to test the JS TurboModule codegen, since the JS codegen should only affect the C++ portion of the TurboModule infra. However, I implemented this while I was in this area of the code, for completeness.

Changelog: [Internal]

Reviewed By: PeteTheHeat

Differential Revision: D22679888

fbshipit-source-id: aa04822bd5a7c889813fcd13ca23c0b7a1d8444a
This commit is contained in:
Ramanpreet Nara
2020-07-31 12:49:15 -07:00
committed by Facebook GitHub Bot
parent 3741134bfb
commit 826067736f
2 changed files with 39 additions and 3 deletions
@@ -156,7 +156,16 @@ public class TurboModuleManager implements JSIModule, TurboModuleRegistry {
moduleHolder = mTurboModuleHolders.get(moduleName);
}
return getModule(moduleName, moduleHolder);
TurboModulePerfLogger.moduleCreateStart(moduleName, moduleHolder.getModuleId());
TurboModule module = getModule(moduleName, moduleHolder, true);
if (module != null) {
TurboModulePerfLogger.moduleCreateEnd(moduleName, moduleHolder.getModuleId());
} else {
TurboModulePerfLogger.moduleCreateFail(moduleName, moduleHolder.getModuleId());
}
return module;
}
/**
@@ -167,11 +176,16 @@ public class TurboModuleManager implements JSIModule, TurboModuleRegistry {
* initialized.
*/
@Nullable
private TurboModule getModule(String moduleName, @NonNull TurboModuleHolder moduleHolder) {
private TurboModule getModule(
String moduleName, @NonNull TurboModuleHolder moduleHolder, boolean shouldPerfLog) {
boolean shouldCreateModule = false;
synchronized (moduleHolder) {
if (moduleHolder.isDoneCreatingModule()) {
if (shouldPerfLog) {
TurboModulePerfLogger.moduleCreateCacheHit(moduleName, moduleHolder.getModuleId());
}
return moduleHolder.getModule();
}
@@ -183,12 +197,16 @@ public class TurboModuleManager implements JSIModule, TurboModuleRegistry {
}
if (shouldCreateModule) {
TurboModulePerfLogger.moduleCreateConstructStart(moduleName, moduleHolder.getModuleId());
TurboModule turboModule = mJavaModuleProvider.getModule(moduleName);
if (turboModule == null) {
turboModule = mCxxModuleProvider.getModule(moduleName);
}
TurboModulePerfLogger.moduleCreateConstructEnd(moduleName, moduleHolder.getModuleId());
TurboModulePerfLogger.moduleCreateSetUpStart(moduleName, moduleHolder.getModuleId());
if (turboModule != null) {
synchronized (moduleHolder) {
moduleHolder.setModule(turboModule);
@@ -206,6 +224,7 @@ public class TurboModuleManager implements JSIModule, TurboModuleRegistry {
"TurboModuleManager.getModule: TurboModule " + moduleName + " not found in delegate");
}
TurboModulePerfLogger.moduleCreateSetUpEnd(moduleName, moduleHolder.getModuleId());
synchronized (moduleHolder) {
moduleHolder.endCreatingModule();
moduleHolder.notifyAll();
@@ -312,7 +331,7 @@ public class TurboModuleManager implements JSIModule, TurboModuleRegistry {
* initialized. In this case, we should wait for initialization to complete, before destroying
* the TurboModule.
*/
final TurboModule turboModule = getModule(moduleName, moduleHolder);
final TurboModule turboModule = getModule(moduleName, moduleHolder, false);
if (turboModule != null) {
// TODO(T48014458): Rename this to invalidate()
@@ -338,6 +357,17 @@ public class TurboModuleManager implements JSIModule, TurboModuleRegistry {
private volatile TurboModule mModule = null;
private volatile boolean mIsTryingToCreate = false;
private volatile boolean mIsDoneCreatingModule = false;
private static volatile int sHolderCount = 0;
private volatile int mModuleId;
public TurboModuleHolder() {
mModuleId = sHolderCount;
sHolderCount += 1;
}
int getModuleId() {
return mModuleId;
}
void setModule(@NonNull TurboModule module) {
mModule = module;
@@ -72,6 +72,12 @@ public class TurboModulePerfLogger {
}
}
public static void moduleCreateFail(String moduleName, int id) {
if (sNativeModulePerfLogger != null) {
sNativeModulePerfLogger.moduleCreateFail(moduleName, id);
}
}
private static native void jniEnableCppLogging(NativeModulePerfLogger perfLogger);
public static void enableLogging(NativeModulePerfLogger perfLogger) {