Skip to content
Prev Previous commit
Next Next commit
Lazily initialize things we dont need
  • Loading branch information
romtsn committed Oct 3, 2024
commit 4210b0b815bf912c9219e762c97bb8b2627eb055
41 changes: 34 additions & 7 deletions sentry/src/main/java/io/sentry/SentryOptions.java
Original file line number Diff line number Diff line change
Expand Up @@ -19,13 +19,13 @@
import io.sentry.transport.ITransportGate;
import io.sentry.transport.NoOpEnvelopeCache;
import io.sentry.transport.NoOpTransportGate;
import io.sentry.util.Objects;
import io.sentry.util.Platform;
import io.sentry.util.SampleRateUtils;
import io.sentry.util.StringUtils;
import io.sentry.util.thread.IMainThreadChecker;
import io.sentry.util.thread.NoOpMainThreadChecker;
import java.io.File;
import java.net.Proxy;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
Expand Down Expand Up @@ -119,10 +119,14 @@ public class SentryOptions {
private @NotNull SentryLevel diagnosticLevel = DEFAULT_DIAGNOSTIC_LEVEL;

/** Envelope reader interface */
private @NotNull IEnvelopeReader envelopeReader = new EnvelopeReader(new JsonSerializer(this));
private volatile @Nullable IEnvelopeReader envelopeReader;

private final @NotNull Object envelopeReaderLock = new Object();

/** Serializer interface to serialize/deserialize json events */
private @NotNull ISerializer serializer = new JsonSerializer(this);
private volatile @Nullable ISerializer serializer;

private final @NotNull Object serializerLock = new Object();

/** Max depth when serializing object graphs with reflection. * */
private int maxDepth = 100;
Expand Down Expand Up @@ -416,7 +420,9 @@ public class SentryOptions {

/** Date provider to retrieve the current date from. */
@ApiStatus.Internal
private @NotNull SentryDateProvider dateProvider = new SentryAutoDateProvider();
private volatile @Nullable SentryDateProvider dateProvider;

private final @NotNull Object dateProviderLock = new Object();

private final @NotNull List<IPerformanceCollector> performanceCollectors = new ArrayList<>();

Expand Down Expand Up @@ -605,7 +611,14 @@ public void setDiagnosticLevel(@Nullable final SentryLevel diagnosticLevel) {
* @return the serializer
*/
public @NotNull ISerializer getSerializer() {
return serializer;
if (serializer == null) {
synchronized (serializerLock) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We should replace synchronized with using a ReentrantLock when merging into v8.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yep noted!

if (serializer == null) {
serializer = new JsonSerializer(this);
}
}
}
return Objects.requireNonNull(serializer, "Serializer was null");
}

/**
Expand Down Expand Up @@ -636,7 +649,14 @@ public void setMaxDepth(int maxDepth) {
}

public @NotNull IEnvelopeReader getEnvelopeReader() {
return envelopeReader;
if (envelopeReader == null) {
synchronized (envelopeReaderLock) {
if (envelopeReader == null) {
envelopeReader = new EnvelopeReader(getSerializer());
}
}
}
return Objects.requireNonNull(envelopeReader, "EnvelopeReader was null");
}

public void setEnvelopeReader(final @Nullable IEnvelopeReader envelopeReader) {
Expand Down Expand Up @@ -2212,7 +2232,14 @@ public void setIgnoredCheckIns(final @Nullable List<String> ignoredCheckIns) {
/** Returns the current {@link SentryDateProvider} that is used to retrieve the current date. */
@ApiStatus.Internal
public @NotNull SentryDateProvider getDateProvider() {
return dateProvider;
if (dateProvider == null) {
synchronized (dateProviderLock) {
if (dateProvider == null) {
dateProvider = new SentryAutoDateProvider();
}
}
}
return Objects.requireNonNull(dateProvider, "DateProvider is not set");
}

/**
Expand Down