Levlam race condition still persists

This commit is contained in:
Andrea Cavalli 2020-11-15 20:10:54 +01:00
parent 97dcf5576a
commit e87ddb4d20
4 changed files with 25 additions and 10 deletions

View File

@ -1,5 +1,7 @@
package it.tdlight.common;
import it.tdlight.jni.TdApi;
public abstract class CommonClientManager {
private static InternalClientManager getClientManager(String implementationName) {
@ -32,6 +34,8 @@ public abstract class CommonClientManager {
}
private static TelegramClient create(InternalClient internalClient) {
// Send a dummy request because @levlam is too lazy to fix race conditions in a better way
internalClient.send(new TdApi.GetAuthorizationState(), null, null);
return internalClient;
}
}

View File

@ -7,9 +7,11 @@ import it.unimi.dsi.fastutil.longs.LongArrayList;
import it.unimi.dsi.fastutil.objects.ObjectArrayList;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.locks.ReentrantReadWriteLock;
public class InternalClient implements ClientEventsHandler, TelegramClient {
static final ReentrantReadWriteLock clientInitializationLock = new ReentrantReadWriteLock(true);
private final ConcurrentHashMap<Long, Handler> handlers = new ConcurrentHashMap<Long, Handler>();
private final int clientId;
@ -24,13 +26,18 @@ public class InternalClient implements ClientEventsHandler, TelegramClient {
ResultHandler updateHandler,
ExceptionHandler updateExceptionHandler,
ExceptionHandler defaultExceptionHandler) {
this.updateHandler = new Handler(updateHandler, updateExceptionHandler);
this.updatesHandler = null;
this.defaultExceptionHandler = defaultExceptionHandler;
this.clientManager = clientManager;
this.clientId = NativeClientAccess.create();
clientInitializationLock.writeLock().lock();
try {
this.updateHandler = new Handler(updateHandler, updateExceptionHandler);
this.updatesHandler = null;
this.defaultExceptionHandler = defaultExceptionHandler;
this.clientManager = clientManager;
this.clientId = NativeClientAccess.create();
clientManager.registerClient(clientId, this);
clientManager.registerClient(clientId, this);
} finally {
clientInitializationLock.writeLock().unlock();
}
}
public InternalClient(InternalClientManager clientManager,

View File

@ -49,9 +49,6 @@ public class InternalClientManager implements AutoCloseable {
if (replaced) {
throw new IllegalStateException("Client " + clientId + " already registered");
}
// Send a dummy request because @levlam is too lazy to fix race conditions in a better way
internalClient.send(new TdApi.GetAuthorizationState(), null, null);
}
public String getImplementationName() {

View File

@ -1,5 +1,7 @@
package it.tdlight.common;
import static it.tdlight.common.InternalClient.clientInitializationLock;
import it.tdlight.common.utils.IntSwapper;
import it.tdlight.jni.TdApi;
import it.tdlight.jni.TdApi.Object;
@ -52,7 +54,12 @@ public class ResponseReceiver extends Thread implements AutoCloseable {
try {
while(!closeRequested || !registeredClients.isEmpty()) {
int resultsCount;
resultsCount = NativeClientAccess.receive(clientIds, eventIds, events, 2.0 /*seconds*/);
clientInitializationLock.readLock().lock();
try {
resultsCount = NativeClientAccess.receive(clientIds, eventIds, events, 2.0 /*seconds*/)
} finally {
clientInitializationLock.readLock().unlock();
};
if (resultsCount <= 0)
continue;