Skip to content

Commit 80a0b89

Browse files
committed
perf(modules): Pre-load modules on a background thread
1 parent d9ab996 commit 80a0b89

2 files changed

Lines changed: 19 additions & 4 deletions

File tree

sentry-android-core/src/main/java/io/sentry/android/core/internal/modules/AssetsModulesLoader.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
import java.io.InputStream;
1111
import java.util.Map;
1212
import java.util.TreeMap;
13+
import java.util.concurrent.ExecutorService;
14+
import java.util.concurrent.Executors;
1315
import org.jetbrains.annotations.ApiStatus;
1416
import org.jetbrains.annotations.NotNull;
1517

@@ -21,6 +23,12 @@ public final class AssetsModulesLoader extends ModulesLoader {
2123
public AssetsModulesLoader(final @NotNull Context context, final @NotNull ILogger logger) {
2224
super(logger);
2325
this.context = ContextUtils.getApplicationContext(context);
26+
27+
// pre-load modules on a bg thread to avoid doing so on the main thread in case of a crash/error
28+
final @NotNull ExecutorService executorService = Executors.newSingleThreadExecutor();
29+
//noinspection Convert2MethodRef
30+
executorService.submit(() -> getOrLoadModules());
31+
executorService.shutdown();
2432
}
2533

2634
@Override

sentry/src/main/java/io/sentry/internal/modules/ModulesLoader.java

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
package io.sentry.internal.modules;
22

33
import io.sentry.ILogger;
4+
import io.sentry.ISentryLifecycleToken;
45
import io.sentry.SentryLevel;
6+
import io.sentry.util.AutoClosableReentrantLock;
57
import java.io.BufferedReader;
68
import java.io.IOException;
79
import java.io.InputStream;
@@ -21,18 +23,23 @@ public abstract class ModulesLoader implements IModulesLoader {
2123

2224
public static final String EXTERNAL_MODULES_FILENAME = "sentry-external-modules.txt";
2325
protected final @NotNull ILogger logger;
24-
private @Nullable Map<String, String> cachedModules = null;
26+
27+
private final @NotNull AutoClosableReentrantLock modulesLock = new AutoClosableReentrantLock();
28+
private volatile @Nullable Map<String, String> cachedModules = null;
2529

2630
public ModulesLoader(final @NotNull ILogger logger) {
2731
this.logger = logger;
2832
}
2933

3034
@Override
3135
public @Nullable Map<String, String> getOrLoadModules() {
32-
if (cachedModules != null) {
33-
return cachedModules;
36+
if (cachedModules == null) {
37+
try (final @NotNull ISentryLifecycleToken ignored = modulesLock.acquire()) {
38+
if (cachedModules == null) {
39+
cachedModules = loadModules();
40+
}
41+
}
3442
}
35-
cachedModules = loadModules();
3643
return cachedModules;
3744
}
3845

0 commit comments

Comments
 (0)