Allows all messages to the browser to be sent without waiting for a response.

This prevents any one message from holding up the browser from receiving additional insructions.
This commit is contained in:
Markil3
2021-07-27 10:52:02 -07:00
parent b89dd9783a
commit 6cc001af70

View File

@@ -43,6 +43,10 @@ public class BrowserLink implements Runnable
* This queue serves as a cache for objects we need to send. * This queue serves as a cache for objects we need to send.
*/ */
private final LinkedList<MessagePacket> sendQueue = new LinkedList<>(); private final LinkedList<MessagePacket> sendQueue = new LinkedList<>();
/**
* This queue serves as a cache for objects that are waiting for a response.
*/
private final LinkedList<MessagePacket> sentQueue = new LinkedList<>();
private boolean running; private boolean running;
@@ -69,24 +73,14 @@ public class BrowserLink implements Runnable
{ {
try try
{ {
logger.debug("Writing message {} {}", packet.message[0], packet.message[1]);
this.browserOut.write(packet.message[0]); this.browserOut.write(packet.message[0]);
this.browserOut.write(packet.message[1]); this.browserOut.write(packet.message[1]);
this.browserOut.flush(); this.browserOut.flush();
/* synchronized (this.sentQueue)
* Wait for a response from the browser.
*/
byte[][] returnMessage = this.readMessage();
packet.returnMessage = returnMessage;
if (returnMessage == null)
{ {
logger.info("Browser connection closed."); this.sentQueue.add(packet);
this.running = false;
}
synchronized (this.readLock)
{
logger.trace("Received message, notifying futures.");
this.readLock.notifyAll();
} }
} }
catch (IOException e) catch (IOException e)
@@ -94,6 +88,55 @@ public class BrowserLink implements Runnable
logger.error("Could not send message " + new String(packet.message[1], StandardCharsets.UTF_8), e); logger.error("Could not send message " + new String(packet.message[1], StandardCharsets.UTF_8), e);
} }
} }
try
{
packet = null;
synchronized (this.sentQueue)
{
if (this.sentQueue.size() > 0)
{
packet = this.sentQueue.poll();
}
}
if (packet != null)
{
if (this.browserIn.available() > 0)
{
/*
* Wait for a response from the browser.
*/
byte[][] returnMessage = this.readMessage();
if (returnMessage == null)
{
logger.info("Browser connection closed.");
this.running = false;
}
else
{
logger.debug("Reading message {} {}", returnMessage[0], returnMessage[1]);
packet.returnMessage = returnMessage;
synchronized (this.readLock)
{
logger.trace("Received message, notifying futures.");
this.readLock.notifyAll();
}
}
}
else
{
synchronized (this.sentQueue)
{
this.sentQueue.addFirst(packet);
}
logger.trace("There are no new messages");
}
}
}
catch (IOException e)
{
logger.error("Could not retrieve message", e);
}
} }
} }
finally finally
@@ -200,7 +243,6 @@ public class BrowserLink implements Runnable
*/ */
header.order(ByteOrder.nativeOrder()); header.order(ByteOrder.nativeOrder());
header.putInt(messageData.length); header.putInt(messageData.length);
logger.debug("Writing message {} {}", header.array(), messageJson);
packetEntry = new MessagePacket(new byte[][] {header.array(), messageData}); packetEntry = new MessagePacket(new byte[][] {header.array(), messageData});