blob: 9c1ebc0c0b60316803c4b66ecefdbbba39cda1f4 [file] [log] [blame]
package com.matter.tv.server.service;
import android.util.Log;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
public class ResponseRegistry {
private static final String TAG = "ResponseRegistry";
private AtomicInteger messageCounter = new AtomicInteger();
private Map<Integer, String> responses = new ConcurrentHashMap<>();
private Map<Integer, CountDownLatch> latches = new ConcurrentHashMap<>();
public int getNextMessageCounter() {
int counter = messageCounter.incrementAndGet();
// MAX_VALUE used for error scenarios
if (counter == Integer.MAX_VALUE) {
counter = messageCounter.incrementAndGet();
}
latches.put(counter, new CountDownLatch(1));
return counter;
}
public void waitForMessage(int counter, long timeout, TimeUnit unit) {
CountDownLatch latch = latches.get(counter);
if (latch == null) {
return;
}
try {
if (!latch.await(timeout, unit)) {
Log.i(TAG, "Timed out while waiting for response for message " + counter);
}
} catch (InterruptedException e) {
Log.i(TAG, "Interrupted while waiting for response for message " + counter);
}
}
public void receivedMessageResponse(int counter, String response) {
CountDownLatch latch = latches.remove(counter);
if (latch == null) {
// no point adding response to memory if no one is going to read it.
return;
}
responses.put(counter, response);
latch.countDown();
}
public String readAndRemoveResponse(int counter) {
// caller should manage null values
return responses.remove(counter);
}
}