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