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 CARCHMULTITHREADPOSIX_H 00016 #define CARCHMULTITHREADPOSIX_H 00017 00018 #include "IArchMultithread.h" 00019 #include "stdlist.h" 00020 #include <pthread.h> 00021 00022 #define ARCH_MULTITHREAD CArchMultithreadPosix 00023 00024 class CArchCondImpl { 00025 public: 00026 pthread_cond_t m_cond; 00027 }; 00028 00029 class CArchMutexImpl { 00030 public: 00031 pthread_mutex_t m_mutex; 00032 }; 00033 00035 class CArchMultithreadPosix : public IArchMultithread { 00036 public: 00037 CArchMultithreadPosix(); 00038 virtual ~CArchMultithreadPosix(); 00039 00041 00042 00043 void setNetworkDataForCurrentThread(void*); 00044 00046 00047 00048 00049 void* getNetworkDataForThread(CArchThread); 00050 00051 static CArchMultithreadPosix* getInstance(); 00052 00054 00055 // IArchMultithread overrides 00056 virtual CArchCond newCondVar(); 00057 virtual void closeCondVar(CArchCond); 00058 virtual void signalCondVar(CArchCond); 00059 virtual void broadcastCondVar(CArchCond); 00060 virtual bool waitCondVar(CArchCond, CArchMutex, double timeout); 00061 virtual CArchMutex newMutex(); 00062 virtual void closeMutex(CArchMutex); 00063 virtual void lockMutex(CArchMutex); 00064 virtual void unlockMutex(CArchMutex); 00065 virtual CArchThread newThread(ThreadFunc, void*); 00066 virtual CArchThread newCurrentThread(); 00067 virtual CArchThread copyThread(CArchThread); 00068 virtual void closeThread(CArchThread); 00069 virtual void cancelThread(CArchThread); 00070 virtual void setPriorityOfThread(CArchThread, int n); 00071 virtual void testCancelThread(); 00072 virtual bool wait(CArchThread, double timeout); 00073 virtual bool isSameThread(CArchThread, CArchThread); 00074 virtual bool isExitedThread(CArchThread); 00075 virtual void* getResultOfThread(CArchThread); 00076 virtual ThreadID getIDOfThread(CArchThread); 00077 virtual void setSignalHandler(ESignal, SignalFunc, void*); 00078 virtual void raiseSignal(ESignal); 00079 00080 private: 00081 void startSignalHandler(); 00082 00083 CArchThreadImpl* find(pthread_t thread); 00084 CArchThreadImpl* findNoRef(pthread_t thread); 00085 void insert(CArchThreadImpl* thread); 00086 void erase(CArchThreadImpl* thread); 00087 00088 void refThread(CArchThreadImpl* rep); 00089 void testCancelThreadImpl(CArchThreadImpl* rep); 00090 00091 void doThreadFunc(CArchThread thread); 00092 static void* threadFunc(void* vrep); 00093 static void threadCancel(int); 00094 static void* threadSignalHandler(void* vrep); 00095 00096 private: 00097 typedef std::list<CArchThread> CThreadList; 00098 00099 static CArchMultithreadPosix* s_instance; 00100 00101 bool m_newThreadCalled; 00102 00103 CArchMutex m_threadMutex; 00104 CArchThread m_mainThread; 00105 CThreadList m_threadList; 00106 ThreadID m_nextID; 00107 00108 pthread_t m_signalThread; 00109 SignalFunc m_signalFunc[kNUM_SIGNALS]; 00110 void* m_signalUserData[kNUM_SIGNALS]; 00111 }; 00112 00113 #endif