From 8381fcc54ac5edc983a79bc8e0c4dbd073fe561d Mon Sep 17 00:00:00 2001 From: "Brian P. Hinz" Date: Sat, 6 May 2017 10:55:41 -0400 Subject: [PATCH] Multithreaded decoder improvements (java viewer) --- java/com/tigervnc/rfb/DecodeManager.java | 20 +++++++++---------- java/com/tigervnc/rfb/JpegDecompressor.java | 2 +- .../tigervnc/vncviewer/JavaPixelBuffer.java | 1 + 3 files changed, 12 insertions(+), 11 deletions(-) diff --git a/java/com/tigervnc/rfb/DecodeManager.java b/java/com/tigervnc/rfb/DecodeManager.java index 7e2aedf6..c1557460 100644 --- a/java/com/tigervnc/rfb/DecodeManager.java +++ b/java/com/tigervnc/rfb/DecodeManager.java @@ -43,7 +43,6 @@ public class DecodeManager { producerCond = queueMutex.newCondition(); consumerCond = queueMutex.newCondition(); - //cpuCount = 1; cpuCount = Runtime.getRuntime().availableProcessors(); if (cpuCount == 0) { vlog.error("Unable to determine the number of CPU cores on this system"); @@ -151,12 +150,12 @@ public class DecodeManager { bufferStream.length(), conn.cp, entry.affectedRegion); + queueMutex.lock(); + // The workers add buffers to the end so it's safe to assume // the front is still the same buffer freeBuffers.removeFirst(); - queueMutex.lock(); - workQueue.addLast(entry); // We only put a single entry on the queue so waking a single @@ -249,6 +248,7 @@ public class DecodeManager { public void run() { manager.queueMutex.lock(); + while (!stopRequested) { QueueEntry entry; @@ -257,7 +257,7 @@ public class DecodeManager { if (entry == null) { // Wait and try again try { - manager.consumerCond.await(); + manager.consumerCond.await(); } catch (InterruptedException e) { } continue; } @@ -281,7 +281,7 @@ public class DecodeManager { manager.queueMutex.lock(); // Remove the entry from the queue and give back the memory buffer - manager.freeBuffers.add(entry.bufferStream); + manager.freeBuffers.addLast(entry.bufferStream); manager.workQueue.remove(entry); entry = null; @@ -307,7 +307,7 @@ public class DecodeManager { if (!manager.workQueue.peek().active) return manager.workQueue.peek(); - for (iter = manager.workQueue.iterator(); iter.hasNext();) { + next:for (iter = manager.workQueue.iterator(); iter.hasNext();) { QueueEntry entry; Iterator iter2; @@ -317,7 +317,7 @@ public class DecodeManager { // Another thread working on this? if (entry.active) { lockedRegion.assign_union(entry.affectedRegion); - continue; + continue next; } // If this is an ordered decoder then make sure this is the first @@ -326,7 +326,7 @@ public class DecodeManager { for (iter2 = manager.workQueue.iterator(); iter2.hasNext() && iter2 != iter;) { if (entry.encoding == (iter2.next()).encoding) { lockedRegion.assign_union(entry.affectedRegion); - continue; + continue next; } } } @@ -346,14 +346,14 @@ public class DecodeManager { entry2.bufferStream.length(), entry.cp)) lockedRegion.assign_union(entry.affectedRegion); - continue; + continue next; } } // Check overlap with earlier rectangles if (!lockedRegion.intersect(entry.affectedRegion).is_empty()) { lockedRegion.assign_union(entry.affectedRegion); - continue; + continue next; } return entry; diff --git a/java/com/tigervnc/rfb/JpegDecompressor.java b/java/com/tigervnc/rfb/JpegDecompressor.java index 31542942..23c6f65c 100644 --- a/java/com/tigervnc/rfb/JpegDecompressor.java +++ b/java/com/tigervnc/rfb/JpegDecompressor.java @@ -39,11 +39,11 @@ public class JpegDecompressor { ImageIO.setUseCache(false); BufferedImage jpeg = ImageIO.read(new MemoryCacheImageInputStream(new ByteArrayInputStream(src))); + jpeg.setAccelerationPriority(1); BufferedImage image = (BufferedImage)pb.getImage(); Graphics2D g2 = image.createGraphics(); g2.drawImage(jpeg, r.tl.x, r.tl.y, r.width(), r.height(), null); g2.dispose(); - image.flush(); jpeg.flush(); } catch (IOException e) { throw new Exception(e.getMessage()); diff --git a/java/com/tigervnc/vncviewer/JavaPixelBuffer.java b/java/com/tigervnc/vncviewer/JavaPixelBuffer.java index 89c42fe3..16242d05 100644 --- a/java/com/tigervnc/vncviewer/JavaPixelBuffer.java +++ b/java/com/tigervnc/vncviewer/JavaPixelBuffer.java @@ -33,6 +33,7 @@ public class JavaPixelBuffer extends PlatformPixelBuffer getPreferredPF().getColorModel().createCompatibleWritableRaster(w,h)); image = new BufferedImage(getPreferredPF().getColorModel(), getBufferRW(new Rect(0, 0, w, h)), true, null); + image.setAccelerationPriority(1); } public synchronized void fillRect(Rect r, byte[] pix) -- 2.39.5