eathread_mutex.cpp 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. ///////////////////////////////////////////////////////////////////////////////
  2. // Copyright (c) Electronic Arts Inc. All rights reserved.
  3. ///////////////////////////////////////////////////////////////////////////////
  4. #include <eathread/internal/config.h>
  5. EA_DISABLE_VC_WARNING(4574)
  6. #include <string.h>
  7. #include <new>
  8. EA_RESTORE_VC_WARNING()
  9. #if !EA_THREADS_AVAILABLE
  10. #include <eathread/eathread_mutex.h>
  11. #elif EA_USE_CPP11_CONCURRENCY
  12. #include "cpp11/eathread_mutex_cpp11.cpp"
  13. #if defined(CreateMutex)
  14. #undef CreateMutex
  15. #endif
  16. #elif defined(EA_PLATFORM_SONY)
  17. #include "kettle/eathread_mutex_kettle.cpp"
  18. #elif defined(EA_PLATFORM_UNIX) || EA_POSIX_THREADS_AVAILABLE
  19. #include "unix/eathread_mutex_unix.cpp"
  20. #elif defined(EA_PLATFORM_MICROSOFT)
  21. #include "pc/eathread_mutex_pc.cpp"
  22. #endif
  23. namespace EA
  24. {
  25. namespace Thread
  26. {
  27. extern Allocator* gpAllocator;
  28. }
  29. }
  30. EA::Thread::Mutex* EA::Thread::MutexFactory::CreateMutex()
  31. {
  32. if(gpAllocator)
  33. return new(gpAllocator->Alloc(sizeof(EA::Thread::Mutex))) EA::Thread::Mutex;
  34. else
  35. return new EA::Thread::Mutex;
  36. }
  37. void EA::Thread::MutexFactory::DestroyMutex(EA::Thread::Mutex* pMutex)
  38. {
  39. if(gpAllocator)
  40. {
  41. pMutex->~Mutex();
  42. gpAllocator->Free(pMutex);
  43. }
  44. else
  45. delete pMutex;
  46. }
  47. size_t EA::Thread::MutexFactory::GetMutexSize()
  48. {
  49. return sizeof(EA::Thread::Mutex);
  50. }
  51. EA::Thread::Mutex* EA::Thread::MutexFactory::ConstructMutex(void* pMemory)
  52. {
  53. return new(pMemory) EA::Thread::Mutex;
  54. }
  55. void EA::Thread::MutexFactory::DestructMutex(EA::Thread::Mutex* pMutex)
  56. {
  57. pMutex->~Mutex();
  58. }
  59. ///////////////////////////////////////////////////////////////////////////////
  60. // non-threaded implementation
  61. ///////////////////////////////////////////////////////////////////////////////
  62. #if defined(EA_THREAD_NONTHREADED_MUTEX) && EA_THREAD_NONTHREADED_MUTEX
  63. EAMutexData::EAMutexData()
  64. : mnLockCount(0)
  65. {
  66. // Empty
  67. }
  68. EA::Thread::MutexParameters::MutexParameters(bool /*bIntraProcess*/, const char* /*pName*/)
  69. : mbIntraProcess(true)
  70. {
  71. }
  72. EA::Thread::Mutex::Mutex(const MutexParameters* pMutexParameters, bool bDefaultParameters)
  73. {
  74. if(!pMutexParameters && bDefaultParameters)
  75. {
  76. MutexParameters parameters;
  77. Init(&parameters);
  78. }
  79. else
  80. Init(pMutexParameters);
  81. }
  82. EA::Thread::Mutex::~Mutex()
  83. {
  84. EAT_ASSERT(mMutexData.mnLockCount == 0);
  85. }
  86. bool EA::Thread::Mutex::Init(const MutexParameters* /*pMutexParameters*/)
  87. {
  88. // Possibly copy pMutexParameters->mName to mMutexData.mName
  89. return true;
  90. }
  91. int EA::Thread::Mutex::Lock(const ThreadTime& /*timeoutAbsolute*/)
  92. {
  93. EAT_ASSERT(mMutexData.mnLockCount < 100000);
  94. return ++mMutexData.mnLockCount;
  95. }
  96. int EA::Thread::Mutex::Unlock()
  97. {
  98. EAT_ASSERT(mMutexData.mnLockCount > 0);
  99. return --mMutexData.mnLockCount;
  100. }
  101. int EA::Thread::Mutex::GetLockCount() const
  102. {
  103. return mMutexData.mnLockCount;
  104. }
  105. bool EA::Thread::Mutex::HasLock() const
  106. {
  107. return (mMutexData.mnLockCount > 0);
  108. }
  109. #endif // EA_THREAD_NONTHREADED_MUTEX