hkSemaphore.h
上传用户:yisoukefu
上传日期:2020-08-09
资源大小:39506k
文件大小:3k
源码类别:

其他游戏

开发平台:

Visual C++

  1. /* 
  2.  * 
  3.  * Confidential Information of Telekinesys Research Limited (t/a Havok). Not for disclosure or distribution without Havok's
  4.  * prior written consent. This software contains code, techniques and know-how which is confidential and proprietary to Havok.
  5.  * Level 2 and Level 3 source code contains trade secrets of Havok. Havok Software (C) Copyright 1999-2009 Telekinesys Research Limited t/a Havok. All Rights Reserved. Use of this software is subject to the terms of an end user license agreement.
  6.  * 
  7.  */
  8. #ifndef HKBASE_HK_SEMAPHORE_H
  9. #define HKBASE_HK_SEMAPHORE_H
  10. #include <Common/Base/Config/hkConfigThread.h>
  11. #if defined(HK_PLATFORM_PS3_PPU) 
  12. # include <sys/synchronization.h>
  13. #endif
  14. /// A wrapper class for a semaphore.
  15. /// Semaphores are about 10 times slower than critical sections, but
  16. /// they are more flexible.
  17. /// You can think of a Semaphore as a set of tokens.
  18. /// A call to acquire() grabs a token and release puts a token back.
  19. /// If acquire() can not get a token, it simply waits until another thread calls release.
  20. /// If the number of tokens is maxCount, release will do nothing.
  21. class hkSemaphore
  22. {
  23. public:
  24. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR(HK_MEMORY_CLASS_BASE, hkSemaphore);
  25. /// Create a semaphore with an initial count and a maximum count
  26. hkSemaphore( int initialCount = 0, int maxCount = 1000 );
  27. hkSemaphore( hkFinishLoadedObjectFlag f) {}
  28. /// Destruct the Semaphore
  29. ~hkSemaphore();
  30. /// This call will block until the semaphore is released.
  31. void acquire();
  32. /// Release the semaphore. Releases a thread blocked by acquire().
  33. void release(int count = 1);
  34. // These static functions work on both simulated spu and cpu.
  35. static void HK_CALL acquire(hkSemaphore* semaphoreOnPpu);
  36. static void HK_CALL release(hkSemaphore* semaphoreOnPpu, int count = 1);
  37. protected:
  38. #if defined(HK_PLATFORM_PS3_PPU) && (HK_CONFIG_THREAD == HK_CONFIG_MULTI_THREADED)
  39. struct hkSemaphorePS3
  40. {
  41. int curCount;
  42. int maxCount;
  43. sys_mutex_t mutex;
  44. sys_cond_t cond;
  45. } m_semaphore;
  46. #elif (defined(HK_PLATFORM_MACPPC) || defined(HK_PLATFORM_MAC386) || defined(HK_PLATFORM_UNIX)) && (HK_CONFIG_THREAD == HK_CONFIG_MULTI_THREADED)
  47. //Mutex used to simulate the Semaphore
  48. struct hkSemaphorePosix
  49. {
  50. int curCount;
  51. int maxCount;
  52. pthread_mutex_t mutex;
  53. pthread_cond_t cond;
  54. } m_semaphore;
  55. #elif defined(HK_PLATFORM_SIM) // spu simulator
  56. public: void* m_semaphore;
  57. #else
  58. protected: void* m_semaphore;
  59. #endif
  60. };
  61. #endif // HKBASE_HK_SEMAPHORE_H
  62. /*
  63. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  64. * Confidential Information of Havok.  (C) Copyright 1999-2009
  65. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  66. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  67. * rights, and intellectual property rights in the Havok software remain in
  68. * Havok and/or its suppliers.
  69. * Use of this software for evaluation purposes is subject to and indicates
  70. * acceptance of the End User licence Agreement for this product. A copy of
  71. * the license is included with this software and is also available at www.havok.com/tryhavok.
  72. */