UnixThreads.h
上传用户:zhongxx05
上传日期:2007-06-06
资源大小:33641k
文件大小:11k
源码类别:

Symbian

开发平台:

C/C++

  1. /* ***** BEGIN LICENSE BLOCK ***** 
  2.  * Version: RCSL 1.0/RPSL 1.0 
  3.  *  
  4.  * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. 
  5.  *      
  6.  * The contents of this file, and the files included with this file, are 
  7.  * subject to the current version of the RealNetworks Public Source License 
  8.  * Version 1.0 (the "RPSL") available at 
  9.  * http://www.helixcommunity.org/content/rpsl unless you have licensed 
  10.  * the file under the RealNetworks Community Source License Version 1.0 
  11.  * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, 
  12.  * in which case the RCSL will apply. You may also obtain the license terms 
  13.  * directly from RealNetworks.  You may not use this file except in 
  14.  * compliance with the RPSL or, if you have a valid RCSL with RealNetworks 
  15.  * applicable to this file, the RCSL.  Please see the applicable RPSL or 
  16.  * RCSL for the rights, obligations and limitations governing use of the 
  17.  * contents of the file.  
  18.  *  
  19.  * This file is part of the Helix DNA Technology. RealNetworks is the 
  20.  * developer of the Original Code and owns the copyrights in the portions 
  21.  * it created. 
  22.  *  
  23.  * This file, and the files included with this file, is distributed and made 
  24.  * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 
  25.  * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, 
  26.  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS 
  27.  * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 
  28.  * 
  29.  * Technology Compatibility Kit Test Suite(s) Location: 
  30.  *    http://www.helixcommunity.org/content/tck 
  31.  * 
  32.  * Contributor(s): 
  33.  *  
  34.  * ***** END LICENSE BLOCK ***** */ 
  35. #ifndef _UNIXTHREADSH
  36. #define _UNIXTHREADSH
  37. #include "hxthread.h"
  38. #include "hxslist.h"  //for simplelist
  39. #include "hxmap.h"    //for CHXMapLongToObj
  40. //=======================================================================
  41. //
  42. //                      HXUnixMutex
  43. //                   ------------------
  44. //
  45. // NOTE: Mutexs must be recursive.
  46. //=======================================================================
  47. class HXUnixMutex : public HXMutex
  48. {
  49.   public:
  50.     //Ctors and dtors.
  51.     HXUnixMutex();
  52.     virtual ~HXUnixMutex();
  53.     static HX_RESULT MakeMutex( HXMutex*& pMutex );
  54.     
  55.     //inherited methods.
  56.     virtual HX_RESULT Lock();
  57.     virtual HX_RESULT Unlock();
  58.     virtual HX_RESULT Trylock();
  59.         
  60. protected:
  61.     //Must be recursive
  62.     virtual HX_RESULT _Lock() = 0;
  63.     virtual HX_RESULT _Unlock() = 0;
  64.     virtual HX_RESULT _TryLock() = 0;
  65.     
  66.     
  67. private:
  68.     //Prevent unintentional ctors
  69.     HXUnixMutex( const HXUnixMutex& ); //copy ctor
  70.     HXUnixMutex& operator=(const HXUnixMutex& ); //assignment operator.
  71. };
  72. //=======================================================================
  73. //
  74. //                      HXUnixSemaphore
  75. //                   ------------------
  76. //
  77. //=======================================================================
  78. class HXUnixSemaphore
  79. {
  80.   public:
  81.     //Ctors and dtors.
  82.     HXUnixSemaphore(UINT32 unInitialCount=0);
  83.     virtual ~HXUnixSemaphore();
  84.     static HX_RESULT  MakeSemaphore(HXUnixSemaphore*& pSem);
  85.     
  86.     virtual HX_RESULT Post();
  87.     virtual HX_RESULT Wait();
  88.     virtual HX_RESULT TryWait();
  89.     virtual HX_RESULT GetValue(int* pnCount);
  90.         
  91. protected:
  92.     virtual HX_RESULT _Post() = 0;
  93.     virtual HX_RESULT _Wait() = 0;
  94.     virtual HX_RESULT _TryWait() = 0;
  95.     virtual HX_RESULT _GetValue(int* pnCount ) = 0;
  96.     UINT32 m_unInitialCount;
  97. private:
  98.     
  99.     //Prevent unintentional ctors
  100.     HXUnixSemaphore( const HXUnixSemaphore& ); //copy ctor
  101.     HXUnixSemaphore& operator=(const HXUnixSemaphore& ); //assignment operator.
  102. };
  103. //=======================================================================
  104. //
  105. //                      HXUnixCondition
  106. //                   ---------------------
  107. //
  108. //=======================================================================
  109. class HXUnixCondition
  110. {
  111. public:
  112.     
  113.     virtual ~HXUnixCondition();
  114.     static  HX_RESULT MakeCondition( HXUnixCondition*& pCond,
  115.                                      HXUnixMutex*&     pMutex );
  116.     virtual HX_RESULT Wait();
  117.     virtual HX_RESULT TimedWait( UINT32 uTimeoutPeriod = ALLFS);
  118.     virtual HX_RESULT Broadcast();
  119.     virtual HX_RESULT Signal();
  120. protected:
  121.     
  122.     virtual HX_RESULT _Wait() = 0;
  123.     virtual HX_RESULT _TimedWait( UINT32 uTimeoutPeriod = ALLFS) = 0;
  124.     virtual HX_RESULT _Broadcast() = 0;
  125.     virtual HX_RESULT _Signal() = 0;
  126.     HXUnixCondition();
  127. private:
  128.     //Protect unintentional ctors
  129.     HXUnixCondition( const HXUnixCondition& ); //copy ctor.
  130.     HXUnixCondition& operator=(const HXUnixCondition& ); //assignment oper.
  131. };
  132. //=======================================================================
  133. //
  134. //                      HXUnixEvent
  135. //                   ------------------
  136. //
  137. //=======================================================================
  138. class HXUnixEvent : public HXEvent
  139. {
  140. public:
  141.     
  142.     HXUnixEvent(const char* pEventName = NULL, BOOL bManualReset=TRUE);
  143.     virtual ~HXUnixEvent();
  144.     
  145.     virtual HX_RESULT SignalEvent();
  146.     virtual HX_RESULT ResetEvent();
  147.     virtual void*     GetEventHandle();
  148.     virtual HX_RESULT Wait( UINT32 uTimeoutPeriod = ALLFS );
  149. protected:
  150. private:
  151.     BOOL m_bIsManualReset;
  152.     BOOL m_bEventIsSet;
  153.     
  154.     //These two are used for non manual resets (true cond vars)
  155.     HXUnixMutex*     m_pCondLock;
  156.     HXUnixCondition* m_pCond;
  157.     
  158.     //Protect unintentional ctors
  159.     HXUnixEvent( const HXUnixEvent& ); //copy ctor.
  160.     HXUnixEvent& operator=(const HXUnixEvent& ); //assignment oper.
  161. };
  162. //=======================================================================
  163. //
  164. //                      HXUnixThread
  165. //                   ------------------
  166. //
  167. //=======================================================================
  168. class HXUnixThread : public HXThread
  169. {
  170.   public:
  171.     HXUnixThread();
  172.     virtual ~HXUnixThread();
  173.     static HX_RESULT MakeThread(HXThread*& pThread );
  174.     
  175.     virtual HX_RESULT CreateThread( void*(pExecAddr(void*)),
  176.                                     void* pArg,
  177.                                     ULONG32 ulCreationFlags=0);
  178.     virtual HX_RESULT Suspend();
  179.     virtual HX_RESULT Resume();
  180.     virtual HX_RESULT SetPriority( UINT32 ulPriority);
  181.     virtual HX_RESULT GetPriority( UINT32& ulPriority);
  182.     virtual HX_RESULT YieldTimeSlice();
  183.     virtual HX_RESULT Exit(UINT32 unExitCode);
  184.     //This call returns the CREATED THREAD's ID, not the calling thread's.
  185.     virtual HX_RESULT GetThreadId(UINT32& ulThreadId);
  186.     //This call returns the *CALLING THREAD's ID* not the one that was created.
  187.     virtual ULONG32 GetCurrentThreadID();
  188.     //DEPRICATED Use GetCurrentThreadID instead.
  189.     virtual ULONG32 Self()
  190.     {
  191.         return GetCurrentThreadID();
  192.     }
  193.         
  194.     //DEPRICATED Use GetCurrentThreadID instead.
  195.     
  196.     virtual HX_RESULT PostMessage(HXThreadMessage* pMsg, void* pWindowHandle=NULL);
  197.     virtual HX_RESULT GetMessage( HXThreadMessage* pMsg,
  198.                                   UINT32 ulMsgFilterMin = 0, //Not used for now.
  199.                                   UINT32 ulMsgFilterMax = 0  //Not used for now.
  200.                                   );
  201.     virtual HX_RESULT PeekMessageMatching( HXThreadMessage* pMsg,
  202.                                            HXThreadMessage* pMatch,
  203.                                            BOOL             bRemoveMessage = 1
  204.                                            );
  205.     virtual HX_RESULT PeekMessage( HXThreadMessage* pMsg,
  206.                                    UINT32 ulMsgFilterMin = 0, //Not used for now.
  207.                                    UINT32 ulMsgFilterMax = 0, //Not used for now.
  208.                                    BOOL   bRemoveMessage = 1
  209.                                    );
  210.     virtual HX_RESULT DispatchMessage(HXThreadMessage* pMsg);
  211.     //
  212.     // New methods for Unix thread support.
  213.     //
  214.     //Cancels the child thtread.
  215.     HX_RESULT CancelThread();
  216.     //Waits for the child thread to exit and return the thread result code.
  217.     //Returns -1 if the thread was cancelled.
  218.     ULONG32   JoinThread();
  219.     
  220. protected:
  221.     //
  222.     // Pure virtuals that implement the OS specific chores.
  223.     //
  224.     //Create a thread and return the ID.
  225.     virtual HX_RESULT _thread_create( ULONG32& ulThreadID,
  226.                                       void*(pfExecFunc(void*)),
  227.                                       void* pArg ) = 0;
  228.     //Just returns the calling threads ID. Hope we never have a platform
  229.     //that doesn't use ints or longs for thread IDs.
  230.     virtual ULONG32 _thread_self() = 0;
  231.     //Exit the calling thread passing back unExitCode as the return
  232.     //value.
  233.     virtual void _thread_exit( UINT32 unExitCode ) = 0;
  234.     //Cancel the thread passed in.
  235.     virtual void _thread_cancel(ULONG32 ulThreadID) = 0;
  236.     //Wait for ulThreadID to exit and return the ret code.
  237.     virtual ULONG32  _thread_join( ULONG32 ulThreadID ) = 0;
  238.     
  239. private:
  240.     ULONG32        m_threadID;        //The created thread ID.
  241.     CHXSimpleList  m_messageQue;      //Our Message Que.
  242.     
  243.     //Used to make GetMessage blocking and to protect access to the que.
  244.     HXUnixCondition*  m_pCond;
  245.     HXUnixMutex*      m_pCondLock;
  246.     
  247.     //Prevent unintentional ctors
  248.     HXUnixThread( const HXUnixThread& ); //copy ctor
  249.     HXUnixThread& operator=(const HXUnixThread&); //assignment operator.
  250. };
  251. class HXUnixAsyncTimer
  252. {
  253. public:
  254.     //
  255.     // These two methods are the main interface into this class. It 
  256.     // make it work just like the windows ::SetTimer and ::KillTimer
  257.     // functions.
  258.     static UINT32 SetTimer(ULONG32 ulTimeOut, HXThread* pReceivingThread );
  259.     static UINT32 SetTimer(ULONG32 ulTimeOut, TIMERPROC pfExecFunc );
  260.     static BOOL   KillTimer(UINT32 ulTimerID );
  261.         
  262. protected:
  263.     
  264.     //This starts the message pump sending HXMSG_ASYNC_TIMER messages
  265.     //to pReceivingThread's queue every ulThreadId milliseconds.
  266.     HXUnixAsyncTimer( ULONG32 ulTimeOut, HXThread* pReceivingThread );
  267.     //This starts the timer and calls pfExecFunc every ulTimeOut milliseconds.
  268.     HXUnixAsyncTimer( ULONG32 ulTimeOut, TIMERPROC pfExecFunc );
  269.     
  270.     //this kills the timer and stops pumping messages/func calls.
  271.     ~HXUnixAsyncTimer();
  272.     //This returns that ID of this timer (threadID).
  273.     inline ULONG32 GetID();
  274.     //This is the actual message pump.
  275.     static void* _ActualMessagePump(void* pArg);
  276.     
  277. private:
  278.     ULONG32           m_ulTimeOut;
  279.     HXThread*        m_pReceivingThread;
  280.     HXUnixThread*    m_pMessagePump;
  281.     HXThreadMessage*  m_pMsg;
  282.     HXThreadMessage   m_msgTmp;  //This is a per-class msg to be used by the message pump.
  283.     TIMERPROC         m_pfExecFunc;
  284.     
  285.     //Support for setting/killing timers by ID.
  286.     static HXMutex*       m_pmtxMapLock;
  287.     static CHXMapLongToObj m_mapTimers;
  288.     
  289.     //Don't allow default/copy ctors or assignment oper. You can't dup this class.
  290.     HXUnixAsyncTimer();
  291.     HXUnixAsyncTimer( const HXUnixAsyncTimer& it );
  292.     HXUnixAsyncTimer& operator=( const HXUnixAsyncTimer& it );
  293. };
  294. #endif //_UNIXTHREADSH