From: Pierre Ossman Date: Tue, 24 Nov 2015 16:15:16 +0000 (+0100) Subject: Optimised shortcut for decoding on single CPU systems X-Git-Tag: v1.6.90~95^2~1 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=2b8aa354684ee25821ab2c8be8ba988cf95e4bb9;p=tigervnc.git Optimised shortcut for decoding on single CPU systems --- diff --git a/common/rfb/DecodeManager.cxx b/common/rfb/DecodeManager.cxx index d7cffcfd..a655c53a 100644 --- a/common/rfb/DecodeManager.cxx +++ b/common/rfb/DecodeManager.cxx @@ -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();