Prevent narrow race condition when resetting network components.

This commit is contained in:
Greyson Parrelli 2021-02-05 11:40:58 -05:00 committed by GitHub
parent 2678a00781
commit 951d4ad06f
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -95,15 +95,18 @@ public class ApplicationDependencies {
} }
public static @NonNull SignalServiceAccountManager getSignalServiceAccountManager() { public static @NonNull SignalServiceAccountManager getSignalServiceAccountManager() {
if (accountManager == null) { SignalServiceAccountManager local = accountManager;
synchronized (LOCK) {
if (accountManager == null) { if (local != null) {
accountManager = provider.provideSignalServiceAccountManager(); return local;
}
}
} }
return accountManager; synchronized (LOCK) {
if (accountManager == null) {
accountManager = provider.provideSignalServiceAccountManager();
}
return accountManager;
}
} }
public static @NonNull GroupsV2Authorization getGroupsV2Authorization() { public static @NonNull GroupsV2Authorization getGroupsV2Authorization() {
@ -152,6 +155,12 @@ public class ApplicationDependencies {
} }
public static @NonNull SignalServiceMessageSender getSignalServiceMessageSender() { public static @NonNull SignalServiceMessageSender getSignalServiceMessageSender() {
SignalServiceMessageSender local = messageSender;
if (local != null) {
return local;
}
synchronized (LOCK) { synchronized (LOCK) {
if (messageSender == null) { if (messageSender == null) {
messageSender = provider.provideSignalServiceMessageSender(); messageSender = provider.provideSignalServiceMessageSender();
@ -161,21 +170,23 @@ public class ApplicationDependencies {
IncomingMessageObserver.getUnidentifiedPipe(), IncomingMessageObserver.getUnidentifiedPipe(),
TextSecurePreferences.isMultiDevice(application)); TextSecurePreferences.isMultiDevice(application));
} }
return messageSender;
} }
return messageSender;
} }
public static @NonNull SignalServiceMessageReceiver getSignalServiceMessageReceiver() { public static @NonNull SignalServiceMessageReceiver getSignalServiceMessageReceiver() {
if (messageReceiver == null) { SignalServiceMessageReceiver local = messageReceiver;
synchronized (LOCK) {
if (messageReceiver == null) { if (local != null) {
messageReceiver = provider.provideSignalServiceMessageReceiver(); return local;
}
}
} }
return messageReceiver; synchronized (LOCK) {
if (messageReceiver == null) {
messageReceiver = provider.provideSignalServiceMessageReceiver();
}
return messageReceiver;
}
} }
public static void resetSignalServiceMessageReceiver() { public static void resetSignalServiceMessageReceiver() {
@ -301,15 +312,18 @@ public class ApplicationDependencies {
} }
public static @NonNull IncomingMessageObserver getIncomingMessageObserver() { public static @NonNull IncomingMessageObserver getIncomingMessageObserver() {
if (incomingMessageObserver == null) { IncomingMessageObserver local = incomingMessageObserver;
synchronized (LOCK) {
if (incomingMessageObserver == null) { if (local != null) {
incomingMessageObserver = provider.provideIncomingMessageObserver(); return local;
}
}
} }
return incomingMessageObserver; synchronized (LOCK) {
if (incomingMessageObserver == null) {
incomingMessageObserver = provider.provideIncomingMessageObserver();
}
return incomingMessageObserver;
}
} }
public static @NonNull TrimThreadsByDateManager getTrimThreadsByDateManager() { public static @NonNull TrimThreadsByDateManager getTrimThreadsByDateManager() {