aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrian P. Hinz <bphinz@users.sf.net>2017-05-06 10:55:41 -0400
committerBrian P. Hinz <bphinz@users.sf.net>2017-05-06 10:59:31 -0400
commitdf9104023c5e3e437d1e97d12296e32aca717d97 (patch)
treeb7afc66f756a5e54dfe52c73e5d4d0f987610251
parente00899633fdc19ec2ebc3cb0b95c76583d8263b1 (diff)
downloadtigervnc-df9104023c5e3e437d1e97d12296e32aca717d97.tar.gz
tigervnc-df9104023c5e3e437d1e97d12296e32aca717d97.zip
Multithreaded decoder improvements (java viewer)
-rw-r--r--java/com/tigervnc/rfb/DecodeManager.java20
-rw-r--r--java/com/tigervnc/rfb/JpegDecompressor.java2
-rw-r--r--java/com/tigervnc/vncviewer/JavaPixelBuffer.java1
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<QueueEntry> 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)