mirror of
https://github.com/Mauler125/r5sdk.git
synced 2025-02-09 19:15:03 +01:00
DirtySDK (EA's Dirty Sockets library) will be used for the LiveAPI implementation, and depends on: EABase, EAThread.
145 lines
2.9 KiB
C++
145 lines
2.9 KiB
C++
///////////////////////////////////////////////////////////////////////////////
|
|
// Copyright (c) Electronic Arts Inc. All rights reserved.
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
#include <eathread/internal/config.h>
|
|
|
|
EA_DISABLE_VC_WARNING(4574)
|
|
#include <string.h>
|
|
#include <new>
|
|
EA_RESTORE_VC_WARNING()
|
|
|
|
#if !EA_THREADS_AVAILABLE
|
|
#include <eathread/eathread_mutex.h>
|
|
#elif EA_USE_CPP11_CONCURRENCY
|
|
#include "cpp11/eathread_mutex_cpp11.cpp"
|
|
#if defined(CreateMutex)
|
|
#undef CreateMutex
|
|
#endif
|
|
#elif defined(EA_PLATFORM_SONY)
|
|
#include "sony/eathread_mutex_sony.cpp"
|
|
#elif defined(EA_PLATFORM_UNIX) || EA_POSIX_THREADS_AVAILABLE
|
|
#include "unix/eathread_mutex_unix.cpp"
|
|
#elif defined(EA_PLATFORM_MICROSOFT)
|
|
#include "pc/eathread_mutex_pc.cpp"
|
|
#endif
|
|
|
|
|
|
namespace EA
|
|
{
|
|
namespace Thread
|
|
{
|
|
extern Allocator* gpAllocator;
|
|
}
|
|
}
|
|
|
|
|
|
EA::Thread::Mutex* EA::Thread::MutexFactory::CreateMutex()
|
|
{
|
|
if(gpAllocator)
|
|
return new(gpAllocator->Alloc(sizeof(EA::Thread::Mutex))) EA::Thread::Mutex;
|
|
else
|
|
return new EA::Thread::Mutex;
|
|
}
|
|
|
|
void EA::Thread::MutexFactory::DestroyMutex(EA::Thread::Mutex* pMutex)
|
|
{
|
|
if(gpAllocator)
|
|
{
|
|
pMutex->~Mutex();
|
|
gpAllocator->Free(pMutex);
|
|
}
|
|
else
|
|
delete pMutex;
|
|
}
|
|
|
|
size_t EA::Thread::MutexFactory::GetMutexSize()
|
|
{
|
|
return sizeof(EA::Thread::Mutex);
|
|
}
|
|
|
|
EA::Thread::Mutex* EA::Thread::MutexFactory::ConstructMutex(void* pMemory)
|
|
{
|
|
return new(pMemory) EA::Thread::Mutex;
|
|
}
|
|
|
|
void EA::Thread::MutexFactory::DestructMutex(EA::Thread::Mutex* pMutex)
|
|
{
|
|
pMutex->~Mutex();
|
|
}
|
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
// non-threaded implementation
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
#if defined(EA_THREAD_NONTHREADED_MUTEX) && EA_THREAD_NONTHREADED_MUTEX
|
|
|
|
EAMutexData::EAMutexData()
|
|
: mnLockCount(0)
|
|
{
|
|
// Empty
|
|
}
|
|
|
|
|
|
EA::Thread::MutexParameters::MutexParameters(bool /*bIntraProcess*/, const char* /*pName*/)
|
|
: mbIntraProcess(true)
|
|
{
|
|
}
|
|
|
|
|
|
EA::Thread::Mutex::Mutex(const MutexParameters* pMutexParameters, bool bDefaultParameters)
|
|
{
|
|
if(!pMutexParameters && bDefaultParameters)
|
|
{
|
|
MutexParameters parameters;
|
|
Init(¶meters);
|
|
}
|
|
else
|
|
Init(pMutexParameters);
|
|
}
|
|
|
|
|
|
EA::Thread::Mutex::~Mutex()
|
|
{
|
|
EAT_ASSERT(mMutexData.mnLockCount == 0);
|
|
}
|
|
|
|
|
|
bool EA::Thread::Mutex::Init(const MutexParameters* /*pMutexParameters*/)
|
|
{
|
|
// Possibly copy pMutexParameters->mName to mMutexData.mName
|
|
return true;
|
|
}
|
|
|
|
|
|
int EA::Thread::Mutex::Lock(const ThreadTime& /*timeoutAbsolute*/)
|
|
{
|
|
EAT_ASSERT(mMutexData.mnLockCount < 100000);
|
|
|
|
return ++mMutexData.mnLockCount;
|
|
}
|
|
|
|
|
|
int EA::Thread::Mutex::Unlock()
|
|
{
|
|
EAT_ASSERT(mMutexData.mnLockCount > 0);
|
|
|
|
return --mMutexData.mnLockCount;
|
|
}
|
|
|
|
|
|
int EA::Thread::Mutex::GetLockCount() const
|
|
{
|
|
return mMutexData.mnLockCount;
|
|
}
|
|
|
|
|
|
bool EA::Thread::Mutex::HasLock() const
|
|
{
|
|
return (mMutexData.mnLockCount > 0);
|
|
}
|
|
|
|
#endif // EA_THREAD_NONTHREADED_MUTEX
|