From 0390481825de2c3e15e05049d66c329fe0dbb62a Mon Sep 17 00:00:00 2001 From: Andrea Cavalli Date: Tue, 11 Jan 2022 15:39:25 +0100 Subject: [PATCH] Reduce overhead --- .../tdlight/common/internal/InternalReactiveClient.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/main/java/it/tdlight/common/internal/InternalReactiveClient.java b/src/main/java/it/tdlight/common/internal/InternalReactiveClient.java index 7ade683..ab686a7 100644 --- a/src/main/java/it/tdlight/common/internal/InternalReactiveClient.java +++ b/src/main/java/it/tdlight/common/internal/InternalReactiveClient.java @@ -259,6 +259,8 @@ public final class InternalReactiveClient implements ClientEventsHandler, Reacti @Override public void setListener(SignalListener listener) { logger.debug(TG_MARKER, "Setting handler of client {}", clientId); + + // Keep in mind that this lambda could be called multiple times SignalListener resultListener = this.signalListener.updateAndGet(previousListener -> { if (previousListener instanceof ReplayStartupUpdatesListener) { ReplayStartupUpdatesListener replayListener = (ReplayStartupUpdatesListener) previousListener; @@ -372,7 +374,7 @@ public final class InternalReactiveClient implements ClientEventsHandler, Reacti } } - private static class ReplayStartupUpdatesListener implements SignalListener { + private class ReplayStartupUpdatesListener implements SignalListener { private final ConcurrentLinkedQueue queue = new ConcurrentLinkedQueue<>(); private final AtomicReference listener = new AtomicReference<>(null); @@ -384,11 +386,16 @@ public final class InternalReactiveClient implements ClientEventsHandler, Reacti drainQueue(listener); assert queue.isEmpty(); listener.onSignal(signal); + // Replace itself with the child signal listener, to reduce overhead permanently + InternalReactiveClient.this.signalListener.set(listener); } else { queue.add(signal); } } + /** + * This method could be called multiple times + */ public void setNewListener(SignalListener listener) { this.listener.set(listener); }