| 1 | /* | 
|---|
| 2 | * synergy -- mouse and keyboard sharing utility | 
|---|
| 3 | * Copyright (C) 2002 Chris Schoeneman | 
|---|
| 4 | * | 
|---|
| 5 | * This package is free software you can redistribute it and/or | 
|---|
| 6 | * modify it under the terms of the GNU General Public License | 
|---|
| 7 | * found in the file COPYING that should have accompanied this file. | 
|---|
| 8 | * | 
|---|
| 9 | * This package is distributed in the hope that it will be useful, | 
|---|
| 10 | * but WITHOUT ANY WARRANTY without even the implied warranty of | 
|---|
| 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
|---|
| 12 | * GNU General Public License for more details. | 
|---|
| 13 | */ | 
|---|
| 14 |  | 
|---|
| 15 | #ifndef CARCHMULTITHREADWINDOWS_H | 
|---|
| 16 | #define CARCHMULTITHREADWINDOWS_H | 
|---|
| 17 |  | 
|---|
| 18 | #define INCL_DOS | 
|---|
| 19 | #define INCL_ERRORS | 
|---|
| 20 | #define INCL_PM | 
|---|
| 21 | #include "IArchMultithread.h" | 
|---|
| 22 | #include "stdlist.h" | 
|---|
| 23 | #include <os2emx.h> | 
|---|
| 24 | #include <sys/fmutex.h> | 
|---|
| 25 |  | 
|---|
| 26 | #define ARCH_MULTITHREAD CArchMultithreadOS2 | 
|---|
| 27 |  | 
|---|
| 28 | class CArchCondImpl { | 
|---|
| 29 | public: | 
|---|
| 30 | enum { kSignal = 0, kBroadcast }; | 
|---|
| 31 |  | 
|---|
| 32 | HEV                             m_events[2]; | 
|---|
| 33 | mutable int                     m_waitCount; | 
|---|
| 34 | CArchMutex                      m_waitCountMutex; | 
|---|
| 35 | }; | 
|---|
| 36 |  | 
|---|
| 37 | class CArchMutexImpl { | 
|---|
| 38 | public: | 
|---|
| 39 | _fmutex m_mutex; | 
|---|
| 40 | }; | 
|---|
| 41 |  | 
|---|
| 42 | //! OS2 implementation of IArchMultithread | 
|---|
| 43 | class CArchMultithreadOS2 : public IArchMultithread { | 
|---|
| 44 | public: | 
|---|
| 45 | CArchMultithreadOS2(); | 
|---|
| 46 | virtual ~CArchMultithreadOS2(); | 
|---|
| 47 |  | 
|---|
| 48 | //! @name manipulators | 
|---|
| 49 | //@{ | 
|---|
| 50 |  | 
|---|
| 51 | void                            setNetworkDataForCurrentThread(void*); | 
|---|
| 52 |  | 
|---|
| 53 | //@} | 
|---|
| 54 | //! @name accessors | 
|---|
| 55 | //@{ | 
|---|
| 56 |  | 
|---|
| 57 | HEV                             getCancelEventForCurrentThread(); | 
|---|
| 58 |  | 
|---|
| 59 | void*                           getNetworkDataForThread(CArchThread); | 
|---|
| 60 |  | 
|---|
| 61 | static CArchMultithreadOS2*     getInstance(); | 
|---|
| 62 |  | 
|---|
| 63 | //@} | 
|---|
| 64 |  | 
|---|
| 65 | // IArchMultithread overrides | 
|---|
| 66 | virtual CArchCond       newCondVar(); | 
|---|
| 67 | virtual void            closeCondVar(CArchCond); | 
|---|
| 68 | virtual void            signalCondVar(CArchCond); | 
|---|
| 69 | virtual void            broadcastCondVar(CArchCond); | 
|---|
| 70 | virtual bool            waitCondVar(CArchCond, CArchMutex, double timeout); | 
|---|
| 71 | virtual CArchMutex      newMutex(); | 
|---|
| 72 | virtual void            closeMutex(CArchMutex); | 
|---|
| 73 | virtual void            lockMutex(CArchMutex); | 
|---|
| 74 | virtual void            unlockMutex(CArchMutex); | 
|---|
| 75 | virtual CArchThread     newThread(ThreadFunc, void*); | 
|---|
| 76 | virtual CArchThread     newCurrentThread(); | 
|---|
| 77 | virtual CArchThread     copyThread(CArchThread); | 
|---|
| 78 | virtual void            closeThread(CArchThread); | 
|---|
| 79 | virtual void            cancelThread(CArchThread); | 
|---|
| 80 | virtual void            setPriorityOfThread(CArchThread, int n); | 
|---|
| 81 | virtual void            testCancelThread(); | 
|---|
| 82 | virtual bool            wait(CArchThread, double timeout); | 
|---|
| 83 | virtual bool            isSameThread(CArchThread, CArchThread); | 
|---|
| 84 | virtual bool            isExitedThread(CArchThread); | 
|---|
| 85 | virtual void*           getResultOfThread(CArchThread); | 
|---|
| 86 | virtual ThreadID        getIDOfThread(CArchThread); | 
|---|
| 87 | virtual void            setSignalHandler(ESignal, SignalFunc, void*); | 
|---|
| 88 | virtual void            raiseSignal(ESignal); | 
|---|
| 89 |  | 
|---|
| 90 | private: | 
|---|
| 91 | CArchThreadImpl*        find(int id); | 
|---|
| 92 | CArchThreadImpl*        findNoRef(int id); | 
|---|
| 93 | CArchThreadImpl*        findNoRefOrCreate(int id); | 
|---|
| 94 | void                            insert(CArchThreadImpl* thread); | 
|---|
| 95 | void                            erase(CArchThreadImpl* thread); | 
|---|
| 96 |  | 
|---|
| 97 | void                            refThread(CArchThreadImpl* rep); | 
|---|
| 98 | void                            testCancelThreadImpl(CArchThreadImpl* rep); | 
|---|
| 99 |  | 
|---|
| 100 | void                            doThreadFunc(CArchThread thread); | 
|---|
| 101 | static void                     threadFunc(void* vrep); | 
|---|
| 102 |  | 
|---|
| 103 | private: | 
|---|
| 104 | typedef std::list<CArchThread> CThreadList; | 
|---|
| 105 |  | 
|---|
| 106 | static CArchMultithreadOS2*     s_instance; | 
|---|
| 107 |  | 
|---|
| 108 | CArchMutex                      m_threadMutex; | 
|---|
| 109 |  | 
|---|
| 110 | CThreadList                     m_threadList; | 
|---|
| 111 | CArchThread                     m_mainThread; | 
|---|
| 112 |  | 
|---|
| 113 | SignalFunc                      m_signalFunc[kNUM_SIGNALS]; | 
|---|
| 114 | void*                           m_signalUserData[kNUM_SIGNALS]; | 
|---|
| 115 | }; | 
|---|
| 116 |  | 
|---|
| 117 | typedef CArchMultithreadOS2 CArchMultithreadPosix; | 
|---|
| 118 | #endif | 
|---|