00001 /* 00002 * synergy -- mouse and keyboard sharing utility 00003 * Copyright (C) 2002 Chris Schoeneman 00004 * 00005 * This package is free software you can redistribute it and/or 00006 * modify it under the terms of the GNU General Public License 00007 * found in the file COPYING that should have accompanied this file. 00008 * 00009 * This package is distributed in the hope that it will be useful, 00010 * but WITHOUT ANY WARRANTY without even the implied warranty of 00011 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00012 * GNU General Public License for more details. 00013 */ 00014 00015 #ifndef CARCHMULTITHREADWINDOWS_H 00016 #define CARCHMULTITHREADWINDOWS_H 00017 00018 #define WIN32_LEAN_AND_MEAN 00019 00020 #include "IArchMultithread.h" 00021 #include "stdlist.h" 00022 #include <windows.h> 00023 00024 #define ARCH_MULTITHREAD CArchMultithreadWindows 00025 00026 class CArchCondImpl { 00027 public: 00028 enum { kSignal = 0, kBroadcast }; 00029 00030 HANDLE m_events[2]; 00031 mutable int m_waitCount; 00032 CArchMutex m_waitCountMutex; 00033 }; 00034 00035 class CArchMutexImpl { 00036 public: 00037 CRITICAL_SECTION m_mutex; 00038 }; 00039 00041 class CArchMultithreadWindows : public IArchMultithread { 00042 public: 00043 CArchMultithreadWindows(); 00044 virtual ~CArchMultithreadWindows(); 00045 00047 00048 00049 void setNetworkDataForCurrentThread(void*); 00050 00052 00053 00054 00055 HANDLE getCancelEventForCurrentThread(); 00056 00057 void* getNetworkDataForThread(CArchThread); 00058 00059 static CArchMultithreadWindows* getInstance(); 00060 00062 00063 // IArchMultithread overrides 00064 virtual CArchCond newCondVar(); 00065 virtual void closeCondVar(CArchCond); 00066 virtual void signalCondVar(CArchCond); 00067 virtual void broadcastCondVar(CArchCond); 00068 virtual bool waitCondVar(CArchCond, CArchMutex, double timeout); 00069 virtual CArchMutex newMutex(); 00070 virtual void closeMutex(CArchMutex); 00071 virtual void lockMutex(CArchMutex); 00072 virtual void unlockMutex(CArchMutex); 00073 virtual CArchThread newThread(ThreadFunc, void*); 00074 virtual CArchThread newCurrentThread(); 00075 virtual CArchThread copyThread(CArchThread); 00076 virtual void closeThread(CArchThread); 00077 virtual void cancelThread(CArchThread); 00078 virtual void setPriorityOfThread(CArchThread, int n); 00079 virtual void testCancelThread(); 00080 virtual bool wait(CArchThread, double timeout); 00081 virtual bool isSameThread(CArchThread, CArchThread); 00082 virtual bool isExitedThread(CArchThread); 00083 virtual void* getResultOfThread(CArchThread); 00084 virtual ThreadID getIDOfThread(CArchThread); 00085 virtual void setSignalHandler(ESignal, SignalFunc, void*); 00086 virtual void raiseSignal(ESignal); 00087 00088 private: 00089 CArchThreadImpl* find(DWORD id); 00090 CArchThreadImpl* findNoRef(DWORD id); 00091 CArchThreadImpl* findNoRefOrCreate(DWORD id); 00092 void insert(CArchThreadImpl* thread); 00093 void erase(CArchThreadImpl* thread); 00094 00095 void refThread(CArchThreadImpl* rep); 00096 void testCancelThreadImpl(CArchThreadImpl* rep); 00097 00098 void doThreadFunc(CArchThread thread); 00099 static unsigned int __stdcall threadFunc(void* vrep); 00100 00101 private: 00102 typedef std::list<CArchThread> CThreadList; 00103 00104 static CArchMultithreadWindows* s_instance; 00105 00106 CArchMutex m_threadMutex; 00107 00108 CThreadList m_threadList; 00109 CArchThread m_mainThread; 00110 00111 SignalFunc m_signalFunc[kNUM_SIGNALS]; 00112 void* m_signalUserData[kNUM_SIGNALS]; 00113 }; 00114 00115 #endif