]> source.dussan.org Git - tigervnc.git/commitdiff
Create one decode thread for each CPU
authorPierre Ossman <ossman@cendio.se>
Fri, 13 Nov 2015 13:07:52 +0000 (14:07 +0100)
committerPierre Ossman <ossman@cendio.se>
Fri, 27 Nov 2015 10:12:57 +0000 (11:12 +0100)
We can start creating more decoding threads now that we handle
rect ordering properly. No point in creating more threads than
there are CPUs though.

common/os/Thread.cxx
common/os/Thread.h
common/rfb/DecodeManager.cxx

index 7150a7f21719772aa80e44caa3bb493561c12329..f38a10b7cbfd76b124311ea5ddc70aef8bbec946 100644 (file)
@@ -20,6 +20,7 @@
 #include <windows.h>
 #else
 #include <pthread.h>
+#include <unistd.h>
 #endif
 
 #include <rdr/Exception.h>
@@ -99,6 +100,36 @@ bool Thread::isRunning()
   return running;
 }
 
+size_t Thread::getSystemCPUCount()
+{
+#ifdef WIN32
+  SYSTEM_INFO si;
+  size_t count;
+  DWORD mask;
+
+  GetSystemInfo(&si);
+
+  count = 0;
+  for (mask = si.dwActiveProcessorMask;mask != 0;mask >>= 1) {
+    if (mask & 0x1)
+      count++;
+  }
+
+  if (count > si.dwNumberOfProcessors)
+    count = si.dwNumberOfProcessors;
+
+  return count;
+#else
+  long ret;
+
+  ret = sysconf(_SC_NPROCESSORS_ONLN);
+  if (ret == -1)
+    return 0;
+
+  return ret;
+#endif
+}
+
 #ifdef WIN32
 long unsigned __stdcall Thread::startRoutine(void* data)
 #else
index 41d948689e44bd6966014ea931d78425c407a63f..1a9aa54b9be24473cb8f0a8040df2ca3d875091f 100644 (file)
@@ -32,6 +32,9 @@ namespace os {
 
     bool isRunning();
 
+  public:
+    static size_t getSystemCPUCount();
+
   protected:
     virtual void worker() = 0;
 
index ba2b2d2f33bc9c1a62dd53b07e02066872be6e74..724cf215a474aa750b22afaa249a03aac7bd1cc1 100644 (file)
@@ -38,7 +38,7 @@ static LogWriter vlog("DecodeManager");
 DecodeManager::DecodeManager(CConnection *conn) :
   conn(conn)
 {
-  int i;
+  size_t cpuCount;
 
   memset(decoders, 0, sizeof(decoders));
 
@@ -46,9 +46,15 @@ DecodeManager::DecodeManager(CConnection *conn) :
   producerCond = new os::Condition(queueMutex);
   consumerCond = new os::Condition(queueMutex);
 
-  // Just a single thread for now as we haven't sorted out the
-  // dependencies between rects
-  for (i = 0;i < 1;i++) {
+  cpuCount = os::Thread::getSystemCPUCount();
+  if (cpuCount == 0) {
+    vlog.error("Unable to determine the number of CPU cores on this system");
+    cpuCount = 1;
+  } else {
+    vlog.info("Detected %d CPU core(s) available for decoding", (int)cpuCount);
+  }
+
+  while (cpuCount--) {
     // Twice as many possible entries in the queue as there
     // are worker threads to make sure they don't stall
     freeBuffers.push_back(new rdr::MemOutStream());