chxresourcetoken.cpp
上传用户:zhongxx05
上传日期:2007-06-06
资源大小:33641k
文件大小:2k
源码类别:

Symbian

开发平台:

C/C++

  1. /*============================================================================*
  2.  *
  3.  * (c) 1995-2002 RealNetworks, Inc. Patents pending. All rights reserved.
  4.  *
  5.  *============================================================================*/
  6. #include "hxassert.h"
  7. #include "chxavutil.h"
  8. #include "hxsym_leaveutil.h"
  9. #include "chxresourcetoken.h"
  10. ///////////////////////////////////
  11. // ctor
  12. CHXResourceToken::CHXResourceToken()
  13. : m_bGotIt(false)
  14. , m_bIsOpen(false)
  15. {
  16. }
  17. void CHXResourceToken::ConstructL(const TDesC& name, TInt maxUserCount)
  18. {
  19.     HXSYM_LEAVE_IF_ERR(OpenSemaphoreL(name, maxUserCount));
  20. }
  21. ///////////////////////////////////
  22. // dtor
  23. CHXResourceToken::~CHXResourceToken()
  24. {
  25.     Release();
  26.     if(m_bIsOpen)
  27.     {
  28.         m_sem.Close();
  29.     }
  30. }
  31. ///////////////////////////////////
  32. //
  33. TInt CHXResourceToken::OpenSemaphoreL(const TDesC& name, TInt maxUserCount)
  34. {
  35.     // first try open in case it exists
  36.     TInt err = m_sem.OpenGlobal(name);
  37.     if( err != KErrNone )
  38.     {
  39.         // first user; create (set thread as owner so if thread leaves/exits, semaphore count auto-increments)
  40.         err = m_sem.CreateGlobal(name, maxUserCount, EOwnerThread);
  41.     }
  42.     m_bIsOpen = (KErrNone == err);
  43.     
  44.     return err;
  45. }
  46. ///////////////////////////////////
  47. //
  48. bool CHXResourceToken::TryAcquire()
  49. {
  50.     HX_ASSERT(m_bIsOpen);
  51.     if( !m_bGotIt )
  52.     {
  53.         // acquire the semaphore only if it is available (do not block)
  54.         if(m_sem.Count() > 0)
  55.         {
  56.             // the semaphore is available
  57.             m_sem.Wait();
  58.             m_bGotIt = true;
  59.         }
  60.         
  61.     }
  62.     return m_bGotIt;
  63. }
  64. void CHXResourceToken::Release()
  65. {
  66.     if( m_bGotIt )
  67.     {
  68.         // give up our hold on the semaphore
  69.         m_sem.Signal();
  70.         m_bGotIt = false;
  71.     }
  72. }