CArchMultithreadWindows.h

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

Generated on Fri Nov 6 00:18:44 2009 for synergy-plus by  doxygen 1.4.7