• Main Page
  • Classes
  • Files
  • File List

CArchMultithreadWindows.h

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

Generated on Sun May 19 2013 00:00:04 for Synergy by  doxygen 1.7.1