]> source.dussan.org Git - tigervnc.git/commitdiff
Replace Windows specific thread handling
authorPierre Ossman <ossman@cendio.se>
Thu, 7 Jul 2016 13:35:13 +0000 (15:35 +0200)
committerPierre Ossman <ossman@cendio.se>
Thu, 7 Jul 2016 13:36:36 +0000 (15:36 +0200)
Use the platform independent primitives instead.

23 files changed:
common/rfb/Configuration.cxx
common/rfb/Configuration.h
common/rfb/KeyRemapper.cxx
common/rfb/KeyRemapper.h
common/rfb/Logger_file.cxx
common/rfb/Logger_file.h
common/rfb/Logger_syslog.cxx
common/rfb/Threading.h [deleted file]
win/rfb_win32/CMakeLists.txt
win/rfb_win32/Clipboard.h
win/rfb_win32/RegConfig.cxx
win/rfb_win32/RegConfig.h
win/rfb_win32/Service.cxx
win/rfb_win32/Threading.cxx [deleted file]
win/rfb_win32/Threading.h [deleted file]
win/rfb_win32/WMHooks.cxx
win/rfb_win32/WMNotifier.h
win/winvnc/QueryConnectDialog.cxx
win/winvnc/QueryConnectDialog.h
win/winvnc/STrayIcon.cxx
win/winvnc/STrayIcon.h
win/winvnc/VNCServerWin32.cxx
win/winvnc/VNCServerWin32.h

index 8e1ea6e93dee53a95cc779ca42c6c87fd3afedfd..a5c23028457766c94f64f80b05362e6ae362156f 100644 (file)
 #include <ctype.h>
 #include <string.h>
 
+#include <os/Mutex.h>
+
 #include <rfb/util.h>
 #include <rfb/Configuration.h>
 #include <rfb/LogWriter.h>
 #include <rfb/Exception.h>
-#include <rfb/Threading.h>
 
-#ifdef __RFB_THREADING_IMPL
-// On platforms that support Threading, we use Locks to make getData safe
-#define LOCK_CONFIG Lock l(*configLock())
-rfb::Mutex* configLock_ = 0;
-static rfb::Mutex* configLock() {
-  if (!configLock_)
-    configLock_ = new rfb::Mutex;
-  return configLock_;
-}
-#else
-#define LOCK_CONFIG
-#endif
+#define LOCK_CONFIG os::AutoMutex a(mutex)
 
 #include <rdr/HexOutStream.h>
 #include <rdr/HexInStream.h>
@@ -195,9 +185,12 @@ VoidParameter::VoidParameter(const char* name_, const char* desc_,
 
   _next = conf->head;
   conf->head = this;
+
+  mutex = new os::Mutex();
 }
 
 VoidParameter::~VoidParameter() {
+  delete mutex;
 }
 
 const char*
index da93fddf4640bafb20abd1a734329602e23de260..fbf161db94c15a2eca8e649fa4e357f8c0554142 100644 (file)
@@ -45,6 +45,8 @@
 
 #include <rfb/util.h>
 
+namespace os { class Mutex; }
+
 namespace rfb {
   class VoidParameter;
   struct ParameterIterator;
@@ -174,6 +176,8 @@ namespace rfb {
     bool immutable;
     const char* name;
     const char* description;
+
+    os::Mutex* mutex;
   };
 
   class AliasParameter : public VoidParameter {
index d33f0a45ad801f78dc4fb457b1f54b39b325067d..b4c2793c9d20a13acc1953667cd274638ad42ff8 100644 (file)
@@ -17,6 +17,9 @@
  */
 
 #include <stdio.h>
+
+#include <os/Mutex.h>
+
 #include <rfb/KeyRemapper.h>
 #include <rfb/Configuration.h>
 #include <rfb/LogWriter.h>
@@ -27,14 +30,21 @@ static LogWriter vlog("KeyRemapper");
 
 KeyRemapper KeyRemapper::defInstance;
 
-#ifdef __RFB_THREADING_IMPL
-static Mutex mappingLock;
-#endif
+KeyRemapper::KeyRemapper(const char* m)
+{
+  mutex = new os::Mutex;
+
+  setMapping(m);
+}
+
+KeyRemapper::~KeyRemapper()
+{
+  delete mutex;
+}
 
 void KeyRemapper::setMapping(const char* m) {
-#ifdef __RFB_THREADING_IMPL
-  Lock l(mappingLock);
-#endif
+  os::AutoMutex a(mutex);
+
   mapping.clear();
   while (m[0]) {
     int from, to;
@@ -59,9 +69,8 @@ void KeyRemapper::setMapping(const char* m) {
 }
 
 rdr::U32 KeyRemapper::remapKey(rdr::U32 key) const {
-#ifdef __RFB_THREADING_IMPL
-  Lock l(mappingLock);
-#endif
+  os::AutoMutex a(mutex);
+
   std::map<rdr::U32,rdr::U32>::const_iterator i = mapping.find(key);
   if (i != mapping.end())
     return i->second;
index a4b7aa011134fe4f8719ee5950cf478d88d78191..1406bad2bf44e935daf18ef19a2cf198147addda 100644 (file)
 #include <map>
 #include <rdr/types.h>
 
+namespace os { class Mutex; }
+
 namespace rfb {
 
   class KeyRemapper {
   public:
-    KeyRemapper(const char* m="") { setMapping(m); }
+    KeyRemapper(const char* m="");
+    ~KeyRemapper();
     void setMapping(const char* m);
     rdr::U32 remapKey(rdr::U32 key) const;
     static KeyRemapper defInstance;
   private:
     std::map<rdr::U32,rdr::U32> mapping;
+    os::Mutex* mutex;
   };
 
 };
index ebe15d529df303bc787714cda0c353fe08b49ceb..149ad404206018953dce7935327e313c6ad1324f 100644 (file)
 #include <stdlib.h>
 #include <string.h>
 
+#include <os/Mutex.h>
+
 #include <rfb/util.h>
 #include <rfb/Logger_file.h>
-#include <rfb/Threading.h>
 
 using namespace rfb;
 
-
-// If threading is available then protect the write() operation
-// from concurrent accesses
-#ifdef __RFB_THREADING_IMPL
-static Mutex logLock;
-#endif
-
-
 Logger_File::Logger_File(const char* loggerName)
   : Logger(loggerName), indent(13), width(79), m_filename(0), m_file(0),
     m_lastLogTime(0)
 {
+  mutex = new os::Mutex();
 }
 
 Logger_File::~Logger_File()
 {
   closeFile();
+  delete mutex;
 }
 
 void Logger_File::write(int level, const char *logname, const char *message)
 {
-#ifdef __RFB_THREADING_IMPL
-  Lock l(logLock);
-#endif
+  os::AutoMutex a(mutex);
+
   if (!m_file) {
     if (!m_filename) return;
     CharArray bakFilename(strlen(m_filename) + 1 + 4);
index 5e0c917b504e5e15c8c82f5aa48cf8397f5f4108..5b5c34e1aadae56c681b70dd067d4780f96ef795 100644 (file)
@@ -24,6 +24,8 @@
 #include <time.h>
 #include <rfb/Logger.h>
 
+namespace os { class Mutex; }
+
 namespace rfb {
 
   class Logger_File : public Logger {
@@ -43,6 +45,7 @@ namespace rfb {
     char* m_filename;
     FILE* m_file;
     time_t m_lastLogTime;
+    os::Mutex* mutex;
   };
 
   bool initFileLogger(const char* filename);
index 291d36cdd5a587a648c6110f2088f8dc50c18b5a..dc1d0c1acb3a4de983db8b1d274acf30ab71a1b2 100644 (file)
@@ -25,7 +25,6 @@
 #include <rfb/util.h>
 #include <rfb/Logger_syslog.h>
 #include <rfb/LogWriter.h>
-#include <rfb/Threading.h>
 
 using namespace rfb;
 
diff --git a/common/rfb/Threading.h b/common/rfb/Threading.h
deleted file mode 100644 (file)
index 66b3aa0..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-/* Copyright (C) 2002-2005 RealVNC Ltd.  All Rights Reserved.
- * 
- * This is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- * 
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- * 
- * You should have received a copy of the GNU General Public License
- * along with this software; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,
- * USA.
- */
-
-// -=- Threading.h
-// General purpose threading interface.
-// If the current platform supports threading then __RFB_THREADING_IMPL
-// will be defined after this header has been included.
-
-#ifndef __RFB_THREADING_H__
-#define __RFB_THREADING_H__
-
-#ifdef WIN32
-#include <rfb_win32/Threading.h>
-#endif
-
-#endif // __RFB_THREADING_H__
index 047b0d86f25ad9ee368c274fdb700e7c6a26583a..305247a8cb0e61d15e0a9d732c0e674c0cb03925 100644 (file)
@@ -22,7 +22,6 @@ set(RFB_WIN32_SOURCES
   SInput.cxx
   SocketManager.cxx
   TCharArray.cxx
-  Threading.cxx
   TsSessions.cxx
   Win32Util.cxx
   WMCursor.cxx
index 498f75fec1a98396be03bce66c0b19933794d220..3da7bfcacab497166863b3c665e1b5c3981cca6d 100644 (file)
@@ -25,7 +25,6 @@
 #define __RFB_WIN32_CLIPBOARD_H__
 
 #include <rfb/SDesktop.h>
-#include <rfb/Threading.h>
 #include <rfb_win32/MsgWindow.h>
 #include <rfb_win32/DeviceFrameBuffer.h>
 
index 30cb310202ff2317d0a43e35125472966ed2df91..5c89e780ecb599b0b2a2914faa431d34f3d26242 100644 (file)
@@ -85,30 +85,29 @@ void RegConfig::processEvent(HANDLE event_) {
 }
 
 
-RegConfigThread::RegConfigThread() : Thread("RegConfigThread"), config(&eventMgr) {
+RegConfigThread::RegConfigThread() : config(&eventMgr), thread_id(-1) {
 }
 
 RegConfigThread::~RegConfigThread() {
-  join();
+  PostThreadMessage(thread_id, WM_QUIT, 0, 0);
+  wait();
 }
 
 bool RegConfigThread::start(const HKEY rootKey, const TCHAR* keyname) {
   if (config.setKey(rootKey, keyname)) {
     Thread::start();
+    while (thread_id == (DWORD)-1)
+      Sleep(0);
     return true;
   }
   return false;
 }
 
-void RegConfigThread::run() {
+void RegConfigThread::worker() {
   DWORD result = 0;
   MSG msg;
+  thread_id = GetCurrentThreadId();
   while ((result = eventMgr.getMessage(&msg, 0, 0, 0)) > 0) {}
   if (result < 0)
     throw rdr::SystemException("RegConfigThread failed", GetLastError());
 }
-
-Thread* RegConfigThread::join() {
-  PostThreadMessage(getThreadId(), WM_QUIT, 0, 0);
-  return Thread::join();
-}
index e9c01b1d7e96adcb9ca53405e796399e5161dcb7..c092090dc6f691b2ef6154ab90f0957b8ef52cf4 100644 (file)
@@ -24,7 +24,8 @@
 #ifndef __RFB_WIN32_REG_CONFIG_H__
 #define __RFB_WIN32_REG_CONFIG_H__
 
-#include <rfb/Threading.h>
+#include <os/Thread.h>
+
 #include <rfb/Configuration.h>
 #include <rfb_win32/Registry.h>
 #include <rfb_win32/EventManager.h>
@@ -63,7 +64,7 @@ namespace rfb {
       RegKey key;
     };
 
-    class RegConfigThread : Thread {
+    class RegConfigThread : os::Thread {
     public:
       RegConfigThread();
       ~RegConfigThread();
@@ -71,10 +72,10 @@ namespace rfb {
       // Start the thread, reading from the specified key
       bool start(const HKEY rootkey, const TCHAR* keyname);
     protected:
-      void run();
-      Thread* join();
+      virtual void worker();
       EventManager eventMgr;
       RegConfig config;
+      DWORD thread_id;
     };
 
   };
index d054ce4d19afd65efba1e88f4850e070a45cac0a..719c44b67984a8f1c764b72e6ce6da227e1f9e63 100644 (file)
@@ -22,7 +22,7 @@
 #include <rfb_win32/MsgWindow.h>
 #include <rfb_win32/ModuleFileName.h>
 #include <rfb_win32/Registry.h>
-#include <rfb/Threading.h>
+#include <rfb_win32/Handle.h>
 #include <logmessages/messages.h>
 #include <rdr/Exception.h>
 #include <rfb/LogWriter.h>
diff --git a/win/rfb_win32/Threading.cxx b/win/rfb_win32/Threading.cxx
deleted file mode 100644 (file)
index 5873b58..0000000
+++ /dev/null
@@ -1,151 +0,0 @@
-/* Copyright (C) 2002-2005 RealVNC Ltd.  All Rights Reserved.
- * 
- * This is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- * 
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- * 
- * You should have received a copy of the GNU General Public License
- * along with this software; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,
- * USA.
- */
-
-// -=- Threading.cxx
-// Win32 Threading interface implementation
-
-#include <malloc.h>
-
-#include <rdr/Exception.h>
-#include <rfb/LogWriter.h>
-#include <rfb/util.h>
-#include <rfb_win32/Threading.h>
-
-using namespace rfb;
-
-static LogWriter vlog("Threading");
-
-static DWORD threadStorage = TlsAlloc();
-
-
-inline void logAction(Thread* t, const char* action) {
-  vlog.debug("%-16.16s %s(%p)", action, t->getName(), t);
-}
-
-inline void logError(Thread* t, const char* err) {
-  vlog.error("%-16.16s %s(%p):%s", "failed", t->getName(), t, err);
-}
-
-
-DWORD WINAPI
-Thread::threadProc(LPVOID lpParameter) {
-  Thread* thread = (Thread*) lpParameter;
-  TlsSetValue(threadStorage, thread);
-  logAction(thread, "started");
-  try {
-    thread->run();
-    logAction(thread, "stopped");
-  } catch (rdr::Exception& e) {
-    logError(thread, e.str());
-  }
-  bool deleteThread = false;
-  {
-    Lock l(thread->mutex);
-    thread->state = ThreadStopped;
-    thread->sig->signal();
-    deleteThread = thread->deleteAfterRun;
-  }
-  if (deleteThread)
-    delete thread;
-  return 0;
-}
-
-Thread::Thread(const char* name_) : name(strDup(name_ ? name_ : "Unnamed")), sig(0), deleteAfterRun(false) {
-  sig = new Condition(mutex);
-  cond_event.h = CreateEvent(NULL, TRUE, FALSE, NULL);
-  thread.h = CreateThread(NULL, 0, threadProc, this, CREATE_SUSPENDED, &thread_id);
-  state = ThreadCreated;
-  logAction(this, "created");
-}
-
-Thread::Thread(HANDLE thread_, DWORD thread_id_) : 
-  thread(thread_), thread_id(thread_id_), name(strDup("Native")), sig(0), deleteAfterRun(false) {
-  cond_event.h = CreateEvent(NULL, TRUE, FALSE, NULL);
-  state = ThreadNative;
-  logAction(this, "created");
-}
-
-Thread::~Thread() {
-  logAction(this, "destroying");
-  if (!deleteAfterRun && state != ThreadNative)
-    this->join();
-  if (sig)
-    delete sig;
-  logAction(this, "destroyed");
-}
-
-void
-Thread::run() {
-}
-
-void
-Thread::start() {
-  Lock l(mutex);
-  if (state == ThreadCreated) {
-    state = ThreadStarted;
-    sig->signal();
-    ResumeThread(thread);
-  }
-}
-
-Thread*
-Thread::join() {
-  if (deleteAfterRun)
-    throw rdr::Exception("attempt to join() with deleteAfterRun thread");
-  Lock l(mutex);
-  if (state == ThreadJoined) {
-    logAction(this, "already joined");
-  } else {
-    logAction(this, "joining");
-    while (state == ThreadStarted) {
-      sig->wait();
-      logAction(this, "checking");
-    }
-    state = ThreadJoined;
-    logAction(this, "joined");
-  }
-  return this;
-}
-
-const char*
-Thread::getName() const {
-  return name.buf;
-}
-
-ThreadState
-Thread::getState() const {
-  return state;
-}
-
-unsigned long
-Thread::getThreadId() const {
-  return thread_id;
-}
-
-
-Thread*
-Thread::self() {
-  Thread* thread = (Thread*) TlsGetValue(threadStorage);
-  if (!thread) {
-    // *** memory leak - could use GetExitCodeThread to lazily detect when
-    //     to clean up native thread objects
-    thread = new Thread(GetCurrentThread(), GetCurrentThreadId());
-    TlsSetValue(threadStorage, thread);
-  }
-  return thread;
-}
diff --git a/win/rfb_win32/Threading.h b/win/rfb_win32/Threading.h
deleted file mode 100644 (file)
index 70bef41..0000000
+++ /dev/null
@@ -1,155 +0,0 @@
-/* Copyright (C) 2002-2005 RealVNC Ltd.  All Rights Reserved.
- * 
- * This is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- * 
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- * 
- * You should have received a copy of the GNU General Public License
- * along with this software; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,
- * USA.
- */
-
-// -=- Threading_win32.h
-// Win32 Threading interface implementation
-
-#ifndef __RFB_THREADING_IMPL_WIN32
-#define __RFB_THREADING_IMPL_WIN32
-
-#define __RFB_THREADING_IMPL WIN32
-
-#include <rfb_win32/Handle.h>
-#include <rfb/util.h>
-#include <rdr/Exception.h>
-//#include <stdio.h>
-
-
-namespace rfb {
-  class Condition;
-
-  class Mutex {
-  public:
-    Mutex() {
-      InitializeCriticalSection(&crit);
-    }
-    ~Mutex() {
-      DeleteCriticalSection(&crit);
-    }
-    friend class Lock;
-    friend class Condition;
-  protected:
-    void enter() {EnterCriticalSection(&crit);}
-    void exit() {LeaveCriticalSection(&crit);}
-    CRITICAL_SECTION crit;
-  };
-
-  class Lock {
-  public:
-    Lock(Mutex& m) : mutex(m) {m.enter();}
-    ~Lock() {mutex.exit();}
-  protected:
-    Mutex& mutex;
-  };
-
-  enum ThreadState {ThreadCreated, ThreadStarted, ThreadStopped, ThreadJoined, ThreadNative};
-
-  class Thread {
-  public:
-    Thread(const char* name_=0);
-    virtual ~Thread();
-
-    virtual void run();
-
-    virtual void start();
-    virtual Thread* join();
-
-    const char* getName() const;
-    ThreadState getState() const;
-
-    // Determines whether the thread should delete itself when run() returns
-    // If you set this, you must NEVER call join()!
-    void setDeleteAfterRun() {deleteAfterRun = true;};
-
-    unsigned long getThreadId() const;
-
-    static Thread* self();
-
-    friend class Condition;
-
-  protected:
-    Thread(HANDLE thread_, DWORD thread_id_);
-    static DWORD WINAPI threadProc(LPVOID lpParameter);
-
-    win32::Handle thread;
-    DWORD thread_id;
-    CharArray name;
-    ThreadState state;
-    Condition* sig;
-    Mutex mutex;
-
-    win32::Handle cond_event;
-         Thread* cond_next;
-
-    bool deleteAfterRun;
-  };
-
-  class Condition {
-  public:
-    Condition(Mutex& m) : mutex(m), waiting(0) {
-    }
-    ~Condition() {
-    }
-
-    // Wake up the specified number of threads that are waiting
-    // on this Condition, or all of them if -1 is specified.
-    void signal(int howMany=1) {
-      Lock l(cond_lock);
-      while (waiting && howMany!=0) {
-        SetEvent(waiting->cond_event);
-        waiting = waiting->cond_next;
-        if (howMany>0) --howMany;
-      }
-    }
-
-    // NB: Must hold "mutex" to call wait()
-    // Wait until either the Condition is signalled or the timeout
-    // expires.
-    void wait(DWORD timeout=INFINITE) {
-      Thread* self = Thread::self();
-      ResetEvent(self->cond_event);
-      { Lock l(cond_lock);
-        self->cond_next = waiting;
-        waiting = self;
-      }
-      mutex.exit();
-      DWORD result = WaitForSingleObject(self->cond_event, timeout);
-      mutex.enter();
-      if (result == WAIT_TIMEOUT) {
-        Lock l(cond_lock);
-        // Remove this thread from the Condition
-        for (Thread** removeFrom = &waiting; *removeFrom; removeFrom = &(*removeFrom)->cond_next) {
-          if (*removeFrom == self) {
-            *removeFrom = self->cond_next;
-            break;
-          }
-        }
-      } else if (result == WAIT_FAILED) {
-        throw rdr::SystemException("failed to wait on Condition", GetLastError());
-      }
-    }
-    
-  protected:
-    Mutex& mutex;
-    Mutex cond_lock;
-         Thread* waiting;
-  };
-
-};
-
-#endif // __RFB_THREADING_IMPL
index 0e5e70a4eb9f21dba8be033859e0666c1a454927..bbc15088494a2d908152af7f41b8aebb4f700a24 100644 (file)
 
 // -=- WMHooks.cxx
 
+#include <os/Mutex.h>
+#include <os/Thread.h>
+
 #include <rfb_win32/WMHooks.h>
 #include <rfb_win32/Service.h>
 #include <rfb_win32/MsgWindow.h>
 #include <rfb_win32/IntervalTimer.h>
-#include <rfb/Threading.h>
 #include <rfb/LogWriter.h>
 
 #include <list>
@@ -108,20 +110,21 @@ error:
 }
 
 
-class WMHooksThread : public Thread {
+class WMHooksThread : public os::Thread {
 public:
-  WMHooksThread() : Thread("WMHookThread"), 
-    active(true) {
-  }
-  virtual void run();
-  virtual Thread* join();
+  WMHooksThread() : active(true), thread_id(-1) { }
+  void stop();
+  DWORD getThreadId() { return thread_id; }
+protected:
+  virtual void worker();
 protected:
   bool active;
+  DWORD thread_id;
 };
 
 static WMHooksThread* hook_mgr = 0;
 static std::list<WMHooks*> hooks;
-static Mutex hook_mgr_lock;
+static os::Mutex hook_mgr_lock;
 
 
 static bool StartHookThread() {
@@ -131,15 +134,17 @@ static bool StartHookThread() {
     return false;
   vlog.debug("creating thread");
   hook_mgr = new WMHooksThread();
+  hook_mgr->start();
+  while (hook_mgr->getThreadId() == (DWORD)-1)
+    Sleep(0);
   vlog.debug("installing hooks");
   if (!WM_Hooks_Install(hook_mgr->getThreadId(), 0)) {
     vlog.error("failed to initialise hooks");
-    delete hook_mgr->join();
+    hook_mgr->stop();
+    delete hook_mgr;
     hook_mgr = 0;
     return false;
   }
-  vlog.debug("starting thread");
-  hook_mgr->start();
   return true;
 }
 
@@ -149,14 +154,15 @@ static void StopHookThread() {
   if (!hooks.empty())
     return;
   vlog.debug("closing thread");
-  delete hook_mgr->join();
+  hook_mgr->stop();
+  delete hook_mgr;
   hook_mgr = 0;
 }
 
 
 static bool AddHook(WMHooks* hook) {
   vlog.debug("adding hook");
-  Lock l(hook_mgr_lock);
+  os::AutoMutex a(&hook_mgr_lock);
   if (!StartHookThread())
     return false;
   hooks.push_back(hook);
@@ -166,7 +172,7 @@ static bool AddHook(WMHooks* hook) {
 static bool RemHook(WMHooks* hook) {
   {
     vlog.debug("removing hook");
-    Lock l(hook_mgr_lock);
+    os::AutoMutex a(&hook_mgr_lock);
     hooks.remove(hook);
   }
   StopHookThread();
@@ -174,7 +180,7 @@ static bool RemHook(WMHooks* hook) {
 }
 
 static void NotifyHooksRegion(const Region& r) {
-  Lock l(hook_mgr_lock);
+  os::AutoMutex a(&hook_mgr_lock);
   std::list<WMHooks*>::iterator i;
   for (i=hooks.begin(); i!=hooks.end(); i++)
     (*i)->NotifyHooksRegion(r);
@@ -182,7 +188,7 @@ static void NotifyHooksRegion(const Region& r) {
 
 
 void
-WMHooksThread::run() {
+WMHooksThread::worker() {
   // Obtain message ids for all supported hook messages
   UINT windowMsg = WM_Hooks_WindowChanged();
   UINT clientAreaMsg = WM_Hooks_WindowClientAreaChanged();
@@ -208,6 +214,8 @@ WMHooksThread::run() {
 
   vlog.debug("starting hook thread");
 
+  thread_id = GetCurrentThreadId();
+
   while (active && GetMessage(&msg, NULL, 0, 0)) {
     count++;
 
@@ -283,13 +291,13 @@ WMHooksThread::run() {
   WM_Hooks_Remove(getThreadId());
 }
 
-Thread*
-WMHooksThread::join() {
+void
+WMHooksThread::stop() {
   vlog.debug("stopping WMHooks thread");
   active = false;
   PostThreadMessage(thread_id, WM_QUIT, 0, 0);
-  vlog.debug("joining WMHooks thread");
-  return Thread::join();
+  vlog.debug("waiting for WMHooks thread");
+  wait();
 }
 
 // -=- WMHooks class
@@ -311,7 +319,7 @@ bool rfb::win32::WMHooks::setEvent(HANDLE ue) {
 
 bool rfb::win32::WMHooks::getUpdates(UpdateTracker* ut) {
   if (!updatesReady) return false;
-  Lock l(hook_mgr_lock);
+  os::AutoMutex a(&hook_mgr_lock);
   updates.copyTo(ut);
   updates.clear();
   updatesReady = false;
@@ -363,12 +371,12 @@ static bool blockRealInputs(bool block_) {
   return block_ == blocking;
 }
 
-Mutex blockMutex;
-int blockCount = 0;
+static os::Mutex blockMutex;
+static int blockCount = 0;
 
 bool rfb::win32::WMBlockInput::blockInputs(bool on) {
   if (active == on) return true;
-  Lock l(blockMutex);
+  os::AutoMutex a(&blockMutex);
   int newCount = on ? blockCount+1 : blockCount-1;
   if (!blockRealInputs(newCount > 0))
     return false;
index ada45d0904a0c7d4a26a2ebf3b856e5f02ff93a9..3855430b1e4830536335040e74b49e9efef271ec 100644 (file)
@@ -28,7 +28,6 @@
 #define __RFB_WIN32_NOTIFIER_H__
 
 #include <rfb/SDesktop.h>
-#include <rfb/Threading.h>
 #include <rfb_win32/MsgWindow.h>
 #include <rfb_win32/DeviceFrameBuffer.h>
 #include <rfb_win32/SInput.h>
index 8e506966313c8d276345591fc4650f188e84def3..103621eed30666314cb28931de1875d8b6eeea53 100644 (file)
@@ -41,7 +41,7 @@ static IntParameter timeout("QueryConnectTimeout",
 QueryConnectDialog::QueryConnectDialog(network::Socket* sock_,
                                        const char* userName_,
                                        VNCServerWin32* s)
-: Thread("QueryConnectDialog"), Dialog(GetModuleHandle(0)),
+: Dialog(GetModuleHandle(0)),
   sock(sock_), approve(false), server(s) {
   peerIp.buf = sock->getPeerAddress();
   userName.buf = strDup(userName_);
@@ -54,7 +54,7 @@ void QueryConnectDialog::startDialog() {
 
 // - Thread overrides
 
-void QueryConnectDialog::run() {
+void QueryConnectDialog::worker() {
   countdown = timeout;
   try {
     if (desktopChangeRequired() && !changeDesktop())
index b28de19866fed0f7c1cccb1dd3347ba8d57da819..de5e31ee9db4be699642382edddb71628857e605 100644 (file)
 #ifndef __WINVNC_QUERY_CONNECT_DIALOG_H__
 #define __WINVNC_QUERY_CONNECT_DIALOG_H__
 
-#include <rfb/Threading.h>
 #include <rfb_win32/Dialog.h>
 #include <rfb/util.h>
 
+namespace os { class Thread; }
+
 namespace network { class Socket; }
 
 namespace winvnc {
 
   class VNCServerWin32;
 
-  class QueryConnectDialog : public rfb::Thread, rfb::win32::Dialog {
+  class QueryConnectDialog : public os::Thread, rfb::win32::Dialog {
   public:
     QueryConnectDialog(network::Socket* sock, const char* userName, VNCServerWin32* s);
     virtual void startDialog();
-    virtual void run();
     network::Socket* getSock() {return sock;}
     bool isAccepted() const {return approve;}
   protected:
+    // Thread methods
+    virtual void worker();
 
     // Dialog methods (protected)
     virtual void initDialog();
index 762a56afb6ee77ebefb9c31530492d998dd0efa4..05a38d6e0502fc23112c4e126a43679b33d9d0d4 100644 (file)
 #include <winvnc/VNCServerService.h>
 #include <winvnc/resource.h>
 
+#include <os/Mutex.h>
+#include <os/Thread.h>
+
 #include <rfb/LogWriter.h>
 #include <rfb/Configuration.h>
+
 #include <rfb_win32/LaunchProcess.h>
 #include <rfb_win32/TrayIcon.h>
 #include <rfb_win32/AboutDialog.h>
 #include <rfb_win32/MsgBox.h>
 #include <rfb_win32/Service.h>
 #include <rfb_win32/CurrentUser.h>
+
 #include <winvnc/ControlPanel.h>
 
 using namespace rfb;
@@ -209,7 +214,7 @@ public:
 
     case WM_SET_TOOLTIP:
       {
-        rfb::Lock l(thread.lock);
+        os::AutoMutex a(thread.lock);
         if (thread.toolTip.buf)
           setToolTip(thread.toolTip.buf);
       }
@@ -231,15 +236,24 @@ protected:
 
 STrayIconThread::STrayIconThread(VNCServerWin32& sm, UINT inactiveIcon_, UINT activeIcon_, 
                                  UINT dis_inactiveIcon_, UINT dis_activeIcon_, UINT menu_)
-: Thread("TrayIcon"), windowHandle(0), server(sm),
+: thread_id(-1), windowHandle(0), server(sm),
   inactiveIcon(inactiveIcon_), activeIcon(activeIcon_),
   dis_inactiveIcon(dis_inactiveIcon_), dis_activeIcon(dis_activeIcon_),
   menu(menu_), runTrayIcon(true) {
+  lock = new os::Mutex;
   start();
+  while (thread_id == (DWORD)-1)
+    Sleep(0);
 }
 
+STrayIconThread::~STrayIconThread() {
+  runTrayIcon = false;
+  PostThreadMessage(thread_id, WM_QUIT, 0, 0);
+  delete lock;
+}
 
-void STrayIconThread::run() {
+void STrayIconThread::worker() {
+  thread_id = GetCurrentThreadId();
   while (runTrayIcon) {
     if (rfb::win32::desktopChangeRequired() && 
       !rfb::win32::changeDesktop())
@@ -260,7 +274,7 @@ void STrayIconThread::run() {
 
 void STrayIconThread::setToolTip(const TCHAR* text) {
   if (!windowHandle) return;
-  Lock l(lock);
+  os::AutoMutex a(lock);
   delete [] toolTip.buf;
   toolTip.buf = tstrDup(text);
   PostMessage(windowHandle, WM_SET_TOOLTIP, 0, 0);
index 309d3f4a4492e26bdb60bc37b959890dcdc4bdec..09066362454aa05c02862407bb2cc818d66794d4 100644 (file)
 #include <winvnc/VNCServerWin32.h>
 #include <rfb_win32/TCharArray.h>
 #include <rfb/Configuration.h>
-#include <rfb/Threading.h>
+
+namespace os {
+  class Mutex;
+  class Thread;
+}
 
 namespace winvnc {
 
-  class STrayIconThread : rfb::Thread {
+  class STrayIconThread : os::Thread {
   public:
     STrayIconThread(VNCServerWin32& sm, UINT inactiveIcon,
       UINT activeIcon, UINT dis_inactiveIcon, UINT dis_activeIcon, UINT menu);
-    virtual ~STrayIconThread() {
-      runTrayIcon = false;
-      PostThreadMessage(getThreadId(), WM_QUIT, 0, 0);
-    }
-
-    virtual void run();
+    virtual ~STrayIconThread();
 
     void setToolTip(const TCHAR* text);
 
@@ -44,7 +43,10 @@ namespace winvnc {
 
     friend class STrayIcon;
   protected:
-    rfb::Mutex lock;
+    virtual void worker();
+
+    os::Mutex* lock;
+    DWORD thread_id;
     HWND windowHandle;
     rfb::TCharArray toolTip;
     VNCServerWin32& server;
index 27aea9f69a82c05d0b868b64597897173b51e76b..d86384da48dd4a8b8b4a994db6f724efb045207a 100644 (file)
 #include <winvnc/VNCServerWin32.h>
 #include <winvnc/resource.h>
 #include <winvnc/STrayIcon.h>
+
+#include <os/Mutex.h>
+
 #include <rfb_win32/ComputerName.h>
 #include <rfb_win32/CurrentUser.h>
 #include <rfb_win32/Service.h>
+
 #include <rfb/Hostname.h>
 #include <rfb/LogWriter.h>
 
@@ -53,16 +57,21 @@ static BoolParameter showTrayIcon("ShowTrayIcon",
 
 
 VNCServerWin32::VNCServerWin32()
-  : command(NoCommand), commandSig(commandLock),
+  : command(NoCommand),
     commandEvent(CreateEvent(0, TRUE, FALSE, 0)),
     sessionEvent(isServiceProcess() ?
       CreateEvent(0, FALSE, FALSE, "Global\\SessionEventTigerVNC") : 0),
     vncServer(CStr(ComputerName().buf), &desktop),
-    hostThread(0), runServer(false), isDesktopStarted(false),
+    thread_id(-1), runServer(false), isDesktopStarted(false),
     httpServer(&vncServer), config(&sockMgr),
     rfbSock(&sockMgr), httpSock(&sockMgr), trayIcon(0),
     queryConnectDialog(0)
 {
+  commandLock = new os::Mutex;
+  commandSig = new os::Condition(commandLock);
+
+  runLock = new os::Mutex;
+
   // Initialise the desktop
   desktop.setStatusLocation(&isDesktopStarted);
 
@@ -85,8 +94,15 @@ VNCServerWin32::~VNCServerWin32() {
   desktop.setStatusLocation(0);
 
   // Join the Accept/Reject dialog thread
-  if (queryConnectDialog)
-    delete queryConnectDialog->join();
+  if (queryConnectDialog) {
+    queryConnectDialog->wait();
+    delete queryConnectDialog;
+  }
+
+  delete runLock;
+
+  delete commandSig;
+  delete commandLock;
 }
 
 
@@ -149,8 +165,9 @@ void VNCServerWin32::regConfigChanged() {
 
 
 int VNCServerWin32::run() {
-  { Lock l(runLock);
-    hostThread = Thread::self();
+  {
+    os::AutoMutex a(runLock);
+    thread_id = GetCurrentThreadId();
     runServer = true;
   }
 
@@ -195,19 +212,20 @@ int VNCServerWin32::run() {
     vlog.error("%s", e.str());
   }
 
-  { Lock l(runLock);
+  {
+    os::AutoMutex a(runLock);
     runServer = false;
-    hostThread = 0;
+    thread_id = (DWORD)-1;
   }
 
   return result;
 }
 
 void VNCServerWin32::stop() {
-  Lock l(runLock);
+  os::AutoMutex a(runLock);
   runServer = false;
-  if (hostThread)
-    PostThreadMessage(hostThread->getThreadId(), WM_QUIT, 0, 0);
+  if (thread_id != (DWORD)-1)
+    PostThreadMessage(thread_id, WM_QUIT, 0, 0);
 }
 
 
@@ -261,17 +279,17 @@ void VNCServerWin32::queryConnectionComplete() {
 
 
 bool VNCServerWin32::queueCommand(Command cmd, const void* data, int len, bool wait) {
-  Lock l(commandLock);
+  os::AutoMutex a(commandLock);
   while (command != NoCommand)
-    commandSig.wait();
+    commandSig->wait();
   command = cmd;
   commandData = data;
   commandDataLen = len;
   SetEvent(commandEvent);
   if (wait) {
     while (command != NoCommand)
-      commandSig.wait();
-    commandSig.signal();
+      commandSig->wait();
+    commandSig->signal();
   }
   return true;
 }
@@ -282,7 +300,7 @@ void VNCServerWin32::processEvent(HANDLE event_) {
   if (event_ == commandEvent.h) {
     // If there is no command queued then return immediately
     {
-      Lock l(commandLock);
+      os::AutoMutex a(commandLock);
       if (command == NoCommand)
         return;
     }
@@ -312,7 +330,8 @@ void VNCServerWin32::processEvent(HANDLE event_) {
       vncServer.approveConnection(queryConnectDialog->getSock(),
                                   queryConnectDialog->isAccepted(),
                                   "Connection rejected by user");
-      delete queryConnectDialog->join();
+      queryConnectDialog->wait();
+      delete queryConnectDialog;
       queryConnectDialog = 0;
       break;
 
@@ -322,9 +341,9 @@ void VNCServerWin32::processEvent(HANDLE event_) {
 
     // Clear the command and signal completion
     {
-      Lock l(commandLock);
+      os::AutoMutex a(commandLock);
       command = NoCommand;
-      commandSig.signal();
+      commandSig->signal();
     }
   } else if (event_ == sessionEvent.h) {
     stop();
index b85814a48cc127107312bb35f98181b4f06521e4..225e63423176790e195fd1257199ceb55e1abea5 100644 (file)
 #include <winvnc/JavaViewer.h>
 #include <winvnc/ManagedListener.h>
 
+namespace os {
+    class Mutex;
+    class Condition;
+    class Thread;
+}
+
 namespace winvnc {
 
   class STrayIconThread;
@@ -99,16 +105,16 @@ namespace winvnc {
     Command command;
     const void* commandData;
     int commandDataLen;
-    rfb::Mutex commandLock;
-    rfb::Condition commandSig;
+    os::Mutex* commandLock;
+    os::Condition* commandSig;
     rfb::win32::Handle commandEvent;
     rfb::win32::Handle sessionEvent;
 
     // VNCServerWin32 Server-internal state
     rfb::win32::SDisplay desktop;
     rfb::VNCServerST vncServer;
-    rfb::Mutex runLock;
-    rfb::Thread* hostThread;
+    os::Mutex* runLock;
+    DWORD thread_id;
     bool runServer;
     bool isDesktopStarted;
     JavaViewerServer httpServer;