From 6cc001af704df264b027593b56401dce93f5715a Mon Sep 17 00:00:00 2001 From: Markil3 <75867393+Markil3@users.noreply.github.com> Date: Tue, 27 Jul 2021 10:52:02 -0700 Subject: [PATCH] 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. --- .../universeplayer/addon/BrowserLink.java | 70 +++++++++++++++---- 1 file changed, 56 insertions(+), 14 deletions(-) diff --git a/addonInter/src/main/java/edu/regis/universeplayer/addon/BrowserLink.java b/addonInter/src/main/java/edu/regis/universeplayer/addon/BrowserLink.java index 2c81a44..548368e 100644 --- a/addonInter/src/main/java/edu/regis/universeplayer/addon/BrowserLink.java +++ b/addonInter/src/main/java/edu/regis/universeplayer/addon/BrowserLink.java @@ -43,6 +43,10 @@ public class BrowserLink implements Runnable * This queue serves as a cache for objects we need to send. */ private final LinkedList sendQueue = new LinkedList<>(); + /** + * This queue serves as a cache for objects that are waiting for a response. + */ + private final LinkedList sentQueue = new LinkedList<>(); private boolean running; @@ -69,24 +73,14 @@ public class BrowserLink implements Runnable { try { + logger.debug("Writing message {} {}", packet.message[0], packet.message[1]); this.browserOut.write(packet.message[0]); this.browserOut.write(packet.message[1]); this.browserOut.flush(); - /* - * Wait for a response from the browser. - */ - byte[][] returnMessage = this.readMessage(); - packet.returnMessage = returnMessage; - if (returnMessage == null) + synchronized (this.sentQueue) { - logger.info("Browser connection closed."); - this.running = false; - } - synchronized (this.readLock) - { - logger.trace("Received message, notifying futures."); - this.readLock.notifyAll(); + this.sentQueue.add(packet); } } 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); } } + + 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 @@ -200,7 +243,6 @@ public class BrowserLink implements Runnable */ header.order(ByteOrder.nativeOrder()); header.putInt(messageData.length); - logger.debug("Writing message {} {}", header.array(), messageJson); packetEntry = new MessagePacket(new byte[][] {header.array(), messageData});