UnixThreads.h
上传用户:dangjiwu
上传日期:2013-07-19
资源大小:42019k
文件大小:12k
源码类别:

Symbian

开发平台:

Visual C++

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