]> source.dussan.org Git - tigervnc.git/commitdiff
Optimised shortcut for decoding on single CPU systems
authorPierre Ossman <ossman@cendio.se>
Tue, 24 Nov 2015 16:15:16 +0000 (17:15 +0100)
committerPierre Ossman <ossman@cendio.se>
Fri, 27 Nov 2015 10:16:15 +0000 (11:16 +0100)
common/rfb/DecodeManager.cxx

index d7cffcfd6cf3edc20fd41c3ab3a66e2b54ef9853..a655c53afb395cfa66536cd47494789744517caa 100644 (file)
@@ -56,7 +56,12 @@ DecodeManager::DecodeManager(CConnection *conn) :
     // wasting CPU fighting for locks
     if (cpuCount > 4)
       cpuCount = 4;
-    vlog.info("Creating %d decoder thread(s)", (int)cpuCount);
+    // The overhead of threading is small, but not small enough to
+    // ignore on single CPU systems
+    if (cpuCount == 1)
+      vlog.info("Decoding data on main thread");
+    else
+      vlog.info("Creating %d decoder thread(s)", (int)cpuCount);
   }
 
   while (cpuCount--) {
@@ -116,6 +121,17 @@ void DecodeManager::decodeRect(const Rect& r, int encoding,
 
   decoder = decoders[encoding];
 
+  // Fast path for single CPU machines to avoid the context
+  // switching overhead
+  if (threads.size() == 1) {
+    bufferStream = freeBuffers.front();
+    bufferStream->clear();
+    decoder->readRect(r, conn->getInStream(), conn->cp, bufferStream);
+    decoder->decodeRect(r, bufferStream->data(), bufferStream->length(),
+                        conn->cp, pb);
+    return;
+  }
+
   // Wait for an available memory buffer
   queueMutex->lock();