[development] complete removal of CryThread*.h and MultiThread.h from CryCommon (#3067)
- Replaced Cry-threading related code with AZ equivalents in the Remote Console runtime - Replaced (or removed) usage of CryMutex/CryLock with appropriate AZStd mutex type - Replaced usage of CrySpinLock/CryWriteLock with equivalent AZStd::spin_mutex - Replaced usage of CryInterlocked* with AZStd atomics - Removed all CryThread*.h files - Removed MultiThread.h -- Includes removal of the CryInterlocked* and Cry*CriticalSection functions defined elsewhere - Removed re-implemented stubs of Windows synchapi.h functions Signed-off-by: AMZN-ScottR 24445312+AMZN-ScottR@users.noreply.github.com
This commit is contained in:
+8
-11
@@ -891,8 +891,7 @@ CCrySingleDocTemplate::Confidence CCrySingleDocTemplate::MatchDocType(const char
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
namespace
|
||||
{
|
||||
CryMutex g_splashScreenStateLock;
|
||||
CryConditionVariable g_splashScreenStateChange;
|
||||
AZStd::mutex g_splashScreenStateLock;
|
||||
enum ESplashScreenState
|
||||
{
|
||||
eSplashScreenState_Init, eSplashScreenState_Started, eSplashScreenState_Destroy
|
||||
@@ -923,7 +922,7 @@ QString FormatRichTextCopyrightNotice()
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
void CCryEditApp::ShowSplashScreen(CCryEditApp* app)
|
||||
{
|
||||
g_splashScreenStateLock.Lock();
|
||||
g_splashScreenStateLock.lock();
|
||||
|
||||
CStartupLogoDialog* splashScreen = new CStartupLogoDialog(FormatVersion(app->m_pEditor->GetFileVersion()), FormatRichTextCopyrightNotice());
|
||||
|
||||
@@ -931,8 +930,7 @@ void CCryEditApp::ShowSplashScreen(CCryEditApp* app)
|
||||
g_splashScreen = splashScreen;
|
||||
g_splashScreenState = eSplashScreenState_Started;
|
||||
|
||||
g_splashScreenStateLock.Unlock();
|
||||
g_splashScreenStateChange.Notify();
|
||||
g_splashScreenStateLock.unlock();
|
||||
|
||||
splashScreen->show();
|
||||
// Make sure the initial paint of the splash screen occurs so we dont get stuck with a blank window
|
||||
@@ -940,10 +938,9 @@ void CCryEditApp::ShowSplashScreen(CCryEditApp* app)
|
||||
|
||||
QObject::connect(splashScreen, &QObject::destroyed, splashScreen, [=]
|
||||
{
|
||||
g_splashScreenStateLock.Lock();
|
||||
AZStd::scoped_lock lock(g_splashScreenStateLock);
|
||||
g_pInitializeUIInfo = nullptr;
|
||||
g_splashScreen = nullptr;
|
||||
g_splashScreenStateLock.Unlock();
|
||||
});
|
||||
}
|
||||
|
||||
@@ -973,9 +970,9 @@ void CCryEditApp::CloseSplashScreen()
|
||||
if (CStartupLogoDialog::instance())
|
||||
{
|
||||
delete CStartupLogoDialog::instance();
|
||||
g_splashScreenStateLock.Lock();
|
||||
g_splashScreenStateLock.lock();
|
||||
g_splashScreenState = eSplashScreenState_Destroy;
|
||||
g_splashScreenStateLock.Unlock();
|
||||
g_splashScreenStateLock.unlock();
|
||||
}
|
||||
|
||||
GetIEditor()->Notify(eNotify_OnSplashScreenDestroyed);
|
||||
@@ -984,12 +981,12 @@ void CCryEditApp::CloseSplashScreen()
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
void CCryEditApp::OutputStartupMessage(QString str)
|
||||
{
|
||||
g_splashScreenStateLock.Lock();
|
||||
g_splashScreenStateLock.lock();
|
||||
if (g_pInitializeUIInfo)
|
||||
{
|
||||
g_pInitializeUIInfo->SetInfoText(str.toUtf8().data());
|
||||
}
|
||||
g_splashScreenStateLock.Unlock();
|
||||
g_splashScreenStateLock.unlock();
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
|
||||
@@ -20,7 +20,6 @@
|
||||
#include "LogFile.h"
|
||||
#include "CryListenerSet.h"
|
||||
#include "Util/ModalWindowDismisser.h"
|
||||
#include <CryCommon/CryThread.h>
|
||||
#endif
|
||||
|
||||
class CStartupLogoDialog;
|
||||
@@ -117,11 +116,11 @@ public:
|
||||
|
||||
//! mutex used by other threads to lock up the PAK modification,
|
||||
//! so only one thread can modify the PAK at once
|
||||
static CryMutex& GetPakModifyMutex()
|
||||
static AZStd::recursive_mutex& GetPakModifyMutex()
|
||||
{
|
||||
//! mutex used to halt copy process while the export to game
|
||||
//! or other pak operation is done in the main thread
|
||||
static CryMutex s_pakModifyMutex;
|
||||
static AZStd::recursive_mutex s_pakModifyMutex;
|
||||
return s_pakModifyMutex;
|
||||
}
|
||||
|
||||
|
||||
@@ -136,7 +136,7 @@ bool CGameExporter::Export(unsigned int flags, [[maybe_unused]] EEndian eExportE
|
||||
m_settings.SetHiQuality();
|
||||
}
|
||||
|
||||
CryAutoLock<CryMutex> autoLock(CGameEngine::GetPakModifyMutex());
|
||||
AZStd::scoped_lock autoLock(CGameEngine::GetPakModifyMutex());
|
||||
|
||||
// Close this pak file.
|
||||
if (!CloseLevelPack(m_levelPak, true))
|
||||
|
||||
@@ -252,7 +252,7 @@ void CEditorImpl::Uninitialize()
|
||||
|
||||
void CEditorImpl::UnloadPlugins()
|
||||
{
|
||||
CryAutoLock<CryMutex> lock(m_pluginMutex);
|
||||
AZStd::scoped_lock lock(m_pluginMutex);
|
||||
|
||||
// Flush core buses. We're about to unload DLLs and need to ensure we don't have module-owned functions left behind.
|
||||
AZ::Data::AssetBus::ExecuteQueuedEvents();
|
||||
@@ -273,7 +273,7 @@ void CEditorImpl::UnloadPlugins()
|
||||
|
||||
void CEditorImpl::LoadPlugins()
|
||||
{
|
||||
CryAutoLock<CryMutex> lock(m_pluginMutex);
|
||||
AZStd::scoped_lock lock(m_pluginMutex);
|
||||
|
||||
static const QString editor_plugins_folder("EditorPlugins");
|
||||
|
||||
@@ -1460,7 +1460,7 @@ void CEditorImpl::UnregisterNotifyListener(IEditorNotifyListener* listener)
|
||||
|
||||
ISourceControl* CEditorImpl::GetSourceControl()
|
||||
{
|
||||
CryAutoLock<CryMutex> lock(m_pluginMutex);
|
||||
AZStd::scoped_lock lock(m_pluginMutex);
|
||||
|
||||
if (m_pSourceControl)
|
||||
{
|
||||
|
||||
@@ -401,7 +401,7 @@ protected:
|
||||
IImageUtil* m_pImageUtil; // Vladimir@conffx
|
||||
ILogFile* m_pLogFile; // Vladimir@conffx
|
||||
|
||||
CryMutex m_pluginMutex; // protect any pointers that come from plugins, such as the source control cached pointer.
|
||||
AZStd::mutex m_pluginMutex; // protect any pointers that come from plugins, such as the source control cached pointer.
|
||||
static const char* m_crashLogFileName;
|
||||
};
|
||||
|
||||
|
||||
@@ -9,7 +9,6 @@
|
||||
#include "CryFile.h"
|
||||
#include "PerforceSourceControl.h"
|
||||
#include "PasswordDlg.h"
|
||||
#include <CryCommon/CryThread.h>
|
||||
|
||||
#include <QSettings>
|
||||
#include <QDir>
|
||||
@@ -23,7 +22,7 @@
|
||||
|
||||
namespace
|
||||
{
|
||||
CryCriticalSection g_cPerforceValues;
|
||||
AZStd::mutex g_cPerforceValues;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////
|
||||
@@ -31,9 +30,9 @@ ULONG STDMETHODCALLTYPE CPerforceSourceControl::Release()
|
||||
{
|
||||
if ((--m_ref) == 0)
|
||||
{
|
||||
g_cPerforceValues.Lock();
|
||||
g_cPerforceValues.lock();
|
||||
delete this;
|
||||
g_cPerforceValues.Unlock();
|
||||
g_cPerforceValues.unlock();
|
||||
return 0;
|
||||
}
|
||||
else
|
||||
@@ -57,7 +56,7 @@ void CPerforceSourceControl::ShowSettings()
|
||||
|
||||
void CPerforceSourceControl::SetSourceControlState(SourceControlState state)
|
||||
{
|
||||
CryAutoLock<CryCriticalSection> lock(g_cPerforceValues);
|
||||
AZStd::scoped_lock lock(g_cPerforceValues);
|
||||
|
||||
switch (state)
|
||||
{
|
||||
|
||||
@@ -9,7 +9,6 @@
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "CryThread.h"
|
||||
#include "../Include/SandboxAPI.h"
|
||||
#include <QString>
|
||||
#include <QFileInfo>
|
||||
|
||||
@@ -22,6 +22,8 @@ AZ_PUSH_DISABLE_WARNING(4458, "-Wunknown-warning-option")
|
||||
AZ_POP_DISABLE_WARNING
|
||||
#include <QVariant>
|
||||
|
||||
#include <StlUtils.h>
|
||||
|
||||
inline const char* to_c_str(const char* str) { return str; }
|
||||
#define MAX_VAR_STRING_LENGTH 4096
|
||||
|
||||
|
||||
@@ -72,7 +72,7 @@ bool CryAssert(const char* szCondition, const char* szFile, unsigned int line, b
|
||||
|
||||
static const int max_len = 4096;
|
||||
static char gs_command_str[4096];
|
||||
static CryLockT<CRYLOCK_RECURSIVE> lock;
|
||||
static AZStd::recursive_mutex lock;
|
||||
|
||||
gEnv->pSystem->OnAssert(szCondition, gs_szMessage, szFile, line);
|
||||
|
||||
@@ -80,7 +80,7 @@ bool CryAssert(const char* szCondition, const char* szFile, unsigned int line, b
|
||||
|
||||
if (!gEnv->bNoAssertDialog && !gEnv->bIgnoreAllAsserts)
|
||||
{
|
||||
CryAutoLock< CryLockT<CRYLOCK_RECURSIVE> > lk (lock);
|
||||
AZStd::scoped_lock lk(lock);
|
||||
snprintf(gs_command_str, max_len, "xterm -geometry 100x20 -n 'Assert Dialog [Linux Launcher]' -T 'Assert Dialog [Linux Launcher]' -e 'BinLinux/assert_term \"%s\" \"%s\" %d \"%s\"; echo \"$?\" > .assert_return'",
|
||||
szCondition, (file_len > 60) ? szFile + (file_len - 61) : szFile, line, gs_szMessage);
|
||||
int ret = system(gs_command_str);
|
||||
|
||||
@@ -70,8 +70,6 @@ bool CryAssert(const char* szCondition, const char* szFile, unsigned int line, b
|
||||
static const int max_len = 4096;
|
||||
static char gs_command_str[4096];
|
||||
|
||||
static CryLockT<CRYLOCK_RECURSIVE> lock;
|
||||
|
||||
gEnv->pSystem->OnAssert(szCondition, gs_szMessage, szFile, line);
|
||||
|
||||
size_t file_len = strlen(szFile);
|
||||
|
||||
@@ -1,186 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) Contributors to the Open 3D Engine Project.
|
||||
* For complete copyright and license terms please see the LICENSE at the root of this distribution.
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0 OR MIT
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
// Description : Public include file for the multi-threading API.
|
||||
|
||||
|
||||
#pragma once
|
||||
|
||||
|
||||
// Include basic multithread primitives.
|
||||
#include "MultiThread.h"
|
||||
#include "BitFiddling.h"
|
||||
#include <AzCore/std/string/string.h>
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// Lock types:
|
||||
//
|
||||
// CRYLOCK_FAST
|
||||
// A fast potentially (non-recursive) mutex.
|
||||
// CRYLOCK_RECURSIVE
|
||||
// A recursive mutex.
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
enum CryLockType
|
||||
{
|
||||
CRYLOCK_FAST = 1,
|
||||
CRYLOCK_RECURSIVE = 2,
|
||||
};
|
||||
|
||||
#define CRYLOCK_HAVE_FASTLOCK 1
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Primitive locks and conditions.
|
||||
//
|
||||
// Primitive locks are represented by instance of class CryLockT<Type>
|
||||
//
|
||||
//
|
||||
template<CryLockType Type>
|
||||
class CryLockT
|
||||
{
|
||||
/* Unsupported lock type. */
|
||||
};
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// Typedefs.
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
typedef CryLockT<CRYLOCK_RECURSIVE> CryCriticalSection;
|
||||
typedef CryLockT<CRYLOCK_FAST> CryCriticalSectionNonRecursive;
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// CryAutoCriticalSection implements a helper class to automatically
|
||||
// lock critical section in constructor and release on destructor.
|
||||
//
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
template<class LockClass>
|
||||
class CryAutoLock
|
||||
{
|
||||
private:
|
||||
LockClass* m_pLock;
|
||||
|
||||
CryAutoLock();
|
||||
CryAutoLock(const CryAutoLock<LockClass>&);
|
||||
CryAutoLock<LockClass>& operator = (const CryAutoLock<LockClass>&);
|
||||
|
||||
public:
|
||||
CryAutoLock(LockClass& Lock)
|
||||
: m_pLock(&Lock) { m_pLock->Lock(); }
|
||||
CryAutoLock(const LockClass& Lock)
|
||||
: m_pLock(const_cast<LockClass*>(&Lock)) { m_pLock->Lock(); }
|
||||
~CryAutoLock() { m_pLock->Unlock(); }
|
||||
};
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Auto critical section is the most commonly used type of auto lock.
|
||||
//
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
typedef CryAutoLock<CryCriticalSection> CryAutoCriticalSection;
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Threads.
|
||||
|
||||
// Base class for runnable objects.
|
||||
//
|
||||
// A runnable is an object with a Run() and a Cancel() method. The Run()
|
||||
// method should perform the runnable's job. The Cancel() method may be
|
||||
// called by another thread requesting early termination of the Run() method.
|
||||
// The runnable may ignore the Cancel() call, the default implementation of
|
||||
// Cancel() does nothing.
|
||||
class CryRunnable
|
||||
{
|
||||
public:
|
||||
virtual ~CryRunnable() { }
|
||||
virtual void Run() = 0;
|
||||
virtual void Cancel() { }
|
||||
};
|
||||
|
||||
// Class holding information about a thread.
|
||||
//
|
||||
// A reference to the thread information can be obtained by calling GetInfo()
|
||||
// on the CrySimpleThread (or derived class) instance.
|
||||
//
|
||||
// NOTE:
|
||||
// If the code is compiled with NO_THREADINFO defined, then the GetInfo()
|
||||
// method will return a reference to a static dummy instance of this
|
||||
// structure. It is currently undecided if NO_THREADINFO will be defined for
|
||||
// release builds!
|
||||
|
||||
struct CryThreadInfo
|
||||
{
|
||||
// The symbolic name of the thread.
|
||||
//
|
||||
// You may set this name directly or through the SetName() method of
|
||||
// CrySimpleThread (or derived class).
|
||||
AZStd::string m_Name;
|
||||
|
||||
|
||||
// A thread identification number.
|
||||
// The number is unique but architecture specific. Do not assume anything
|
||||
// about that number except for being unique.
|
||||
//
|
||||
// This field is filled when the thread is started (i.e. before the Run()
|
||||
// method or thread routine is called). It is advised that you do not
|
||||
// change this number manually.
|
||||
uint32 m_ID;
|
||||
};
|
||||
|
||||
// Simple thread class.
|
||||
//
|
||||
// CrySimpleThread is a simple wrapper around a system thread providing
|
||||
// nothing but system-level functionality of a thread. There are two typical
|
||||
// ways to use a simple thread:
|
||||
//
|
||||
// 1. Derive from the CrySimpleThread class and provide an implementation of
|
||||
// the Run() (and optionally Cancel()) methods.
|
||||
// 2. Specify a runnable object when the thread is started. The default
|
||||
// runnable type is CryRunnable.
|
||||
//
|
||||
// The Runnable class specfied as the template argument must provide Run()
|
||||
// and Cancel() methods compatible with the following signatures:
|
||||
//
|
||||
// void Runnable::Run();
|
||||
// void Runnable::Cancel();
|
||||
//
|
||||
// If the Runnable does not support cancellation, then the Cancel() method
|
||||
// should do nothing.
|
||||
//
|
||||
// The same instance of CrySimpleThread may be used for multiple thread
|
||||
// executions /in sequence/, i.e. it is valid to re-start the thread by
|
||||
// calling Start() after the thread has been joined by calling WaitForThread().
|
||||
template<class Runnable = CryRunnable>
|
||||
class CrySimpleThread;
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
// Include architecture specific code.
|
||||
#if AZ_LEGACY_CRYCOMMON_TRAIT_USE_PTHREADS
|
||||
#include <CryThread_pthreads.h>
|
||||
#define AZ_RESTRICTED_SECTION_IMPLEMENTED
|
||||
#elif defined(WIN32) || defined(WIN64)
|
||||
#include <CryThread_windows.h>
|
||||
#define AZ_RESTRICTED_SECTION_IMPLEMENTED
|
||||
#elif defined(AZ_RESTRICTED_PLATFORM)
|
||||
#include AZ_RESTRICTED_FILE(CryThread_h)
|
||||
#endif
|
||||
#if defined(AZ_RESTRICTED_SECTION_IMPLEMENTED)
|
||||
#undef AZ_RESTRICTED_SECTION_IMPLEMENTED
|
||||
#else
|
||||
// Put other platform specific includes here!
|
||||
#include <CryThread_dummy.h>
|
||||
#endif
|
||||
|
||||
#if !defined _CRYTHREAD_CONDLOCK_GLITCH
|
||||
typedef CryLockT<CRYLOCK_RECURSIVE> CryMutex;
|
||||
#endif // !_CRYTHREAD_CONDLOCK_GLITCH
|
||||
|
||||
// Include all multithreading containers.
|
||||
#include "MultiThread_Containers.h"
|
||||
@@ -1,29 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) Contributors to the Open 3D Engine Project.
|
||||
* For complete copyright and license terms please see the LICENSE at the root of this distribution.
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0 OR MIT
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#pragma once
|
||||
|
||||
|
||||
#include <CryThread.h>
|
||||
|
||||
// Include architecture specific code.
|
||||
#if defined(LINUX) || defined(APPLE)
|
||||
#include <CryThreadImpl_pthreads.h>
|
||||
#define AZ_RESTRICTED_SECTION_IMPLEMENTED
|
||||
#elif defined(WIN32) || defined(WIN64)
|
||||
#include <CryThreadImpl_windows.h>
|
||||
#define AZ_RESTRICTED_SECTION_IMPLEMENTED
|
||||
#elif defined(AZ_RESTRICTED_PLATFORM)
|
||||
#include AZ_RESTRICTED_FILE(CryThreadImpl_h)
|
||||
#endif
|
||||
#if defined(AZ_RESTRICTED_SECTION_IMPLEMENTED)
|
||||
#undef AZ_RESTRICTED_SECTION_IMPLEMENTED
|
||||
#else
|
||||
// Put other platform specific includes here!
|
||||
#endif
|
||||
@@ -1,104 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) Contributors to the Open 3D Engine Project.
|
||||
* For complete copyright and license terms please see the LICENSE at the root of this distribution.
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0 OR MIT
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#ifndef CRYINCLUDE_CRYCOMMON_CRYTHREADIMPL_PTHREADS_H
|
||||
#define CRYINCLUDE_CRYCOMMON_CRYTHREADIMPL_PTHREADS_H
|
||||
#pragma once
|
||||
|
||||
|
||||
#include "CryThread_pthreads.h"
|
||||
|
||||
AZ_THREAD_LOCAL CrySimpleThreadSelf* CrySimpleThreadSelf::m_Self = NULL;
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// CryEvent(Timed) implementation
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
void CryEventTimed::Reset()
|
||||
{
|
||||
m_lockNotify.Lock();
|
||||
m_flag = false;
|
||||
m_lockNotify.Unlock();
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
void CryEventTimed::Set()
|
||||
{
|
||||
m_lockNotify.Lock();
|
||||
m_flag = true;
|
||||
m_cond.Notify();
|
||||
m_lockNotify.Unlock();
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
void CryEventTimed::Wait()
|
||||
{
|
||||
m_lockNotify.Lock();
|
||||
if (!m_flag)
|
||||
{
|
||||
m_cond.Wait(m_lockNotify);
|
||||
}
|
||||
m_flag = false;
|
||||
m_lockNotify.Unlock();
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
bool CryEventTimed::Wait(const uint32 timeoutMillis)
|
||||
{
|
||||
bool bResult = true;
|
||||
m_lockNotify.Lock();
|
||||
if (!m_flag)
|
||||
{
|
||||
bResult = m_cond.TimedWait(m_lockNotify, timeoutMillis);
|
||||
}
|
||||
m_flag = false;
|
||||
m_lockNotify.Unlock();
|
||||
return bResult;
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
// CryCriticalSection implementation
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
typedef CryLockT<CRYLOCK_RECURSIVE> TCritSecType;
|
||||
|
||||
void CryDeleteCriticalSection(void* cs)
|
||||
{
|
||||
delete ((TCritSecType*)cs);
|
||||
}
|
||||
|
||||
void CryEnterCriticalSection(void* cs)
|
||||
{
|
||||
((TCritSecType*)cs)->Lock();
|
||||
}
|
||||
|
||||
bool CryTryCriticalSection(void* cs)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
void CryLeaveCriticalSection(void* cs)
|
||||
{
|
||||
((TCritSecType*)cs)->Unlock();
|
||||
}
|
||||
|
||||
void CryCreateCriticalSectionInplace(void* pCS)
|
||||
{
|
||||
new (pCS) TCritSecType;
|
||||
}
|
||||
|
||||
void CryDeleteCriticalSectionInplace(void*)
|
||||
{
|
||||
}
|
||||
|
||||
void* CryCreateCriticalSection()
|
||||
{
|
||||
return (void*) new TCritSecType;
|
||||
}
|
||||
|
||||
#endif // CRYINCLUDE_CRYCOMMON_CRYTHREADIMPL_PTHREADS_H
|
||||
@@ -1,345 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) Contributors to the Open 3D Engine Project.
|
||||
* For complete copyright and license terms please see the LICENSE at the root of this distribution.
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0 OR MIT
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <AzCore/PlatformIncl.h>
|
||||
#include <AzCore/std/parallel/semaphore.h> // for CreateSemaphore
|
||||
|
||||
struct SThreadNameDesc
|
||||
{
|
||||
DWORD dwType;
|
||||
LPCSTR szName;
|
||||
DWORD dwThreadID;
|
||||
DWORD dwFlags;
|
||||
};
|
||||
|
||||
AZ_THREAD_LOCAL CrySimpleThreadSelf* CrySimpleThreadSelf::m_Self = NULL;
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
CryEvent::CryEvent()
|
||||
{
|
||||
m_handle = (void*)CreateEvent(NULL, FALSE, FALSE, NULL);
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
CryEvent::~CryEvent()
|
||||
{
|
||||
CloseHandle(m_handle);
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
void CryEvent::Reset()
|
||||
{
|
||||
ResetEvent(m_handle);
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
void CryEvent::Set()
|
||||
{
|
||||
SetEvent(m_handle);
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
void CryEvent::Wait() const
|
||||
{
|
||||
WaitForSingleObject(m_handle, INFINITE);
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
bool CryEvent::Wait(const uint32 timeoutMillis) const
|
||||
{
|
||||
if (WaitForSingleObject(m_handle, timeoutMillis) == WAIT_TIMEOUT)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// CryLock_WinMutex
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
CryLock_WinMutex::CryLock_WinMutex()
|
||||
: m_hdl(CreateMutex(NULL, FALSE, NULL)) {}
|
||||
CryLock_WinMutex::~CryLock_WinMutex()
|
||||
{
|
||||
CloseHandle(m_hdl);
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
void CryLock_WinMutex::Lock()
|
||||
{
|
||||
WaitForSingleObject(m_hdl, INFINITE);
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
void CryLock_WinMutex::Unlock()
|
||||
{
|
||||
ReleaseMutex(m_hdl);
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
bool CryLock_WinMutex::TryLock()
|
||||
{
|
||||
return WaitForSingleObject(m_hdl, 0) != WAIT_TIMEOUT;
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// CryLock_CritSection
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
CryLock_CritSection::CryLock_CritSection()
|
||||
{
|
||||
InitializeCriticalSection((CRITICAL_SECTION*)&m_cs);
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
CryLock_CritSection::~CryLock_CritSection()
|
||||
{
|
||||
DeleteCriticalSection((CRITICAL_SECTION*)&m_cs);
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
void CryLock_CritSection::Lock()
|
||||
{
|
||||
EnterCriticalSection((CRITICAL_SECTION*)&m_cs);
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
void CryLock_CritSection::Unlock()
|
||||
{
|
||||
LeaveCriticalSection((CRITICAL_SECTION*)&m_cs);
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
bool CryLock_CritSection::TryLock()
|
||||
{
|
||||
return TryEnterCriticalSection((CRITICAL_SECTION*)&m_cs) != FALSE;
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// most of this is taken from http://www.cs.wustl.edu/~schmidt/win32-cv-1.html
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
CryConditionVariable::CryConditionVariable()
|
||||
{
|
||||
m_waitersCount = 0;
|
||||
m_wasBroadcast = 0;
|
||||
m_sema = CreateSemaphore(NULL, 0, 0x7fffffff, NULL);
|
||||
InitializeCriticalSection((CRITICAL_SECTION*)&m_waitersCountLock);
|
||||
m_waitersDone = CreateEvent(NULL, FALSE, FALSE, NULL);
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
CryConditionVariable::~CryConditionVariable()
|
||||
{
|
||||
CloseHandle(m_sema);
|
||||
DeleteCriticalSection((CRITICAL_SECTION*)&m_waitersCountLock);
|
||||
CloseHandle(m_waitersDone);
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
void CryConditionVariable::Wait(LockType& lock)
|
||||
{
|
||||
EnterCriticalSection((CRITICAL_SECTION*)&m_waitersCountLock);
|
||||
m_waitersCount++;
|
||||
LeaveCriticalSection((CRITICAL_SECTION*)&m_waitersCountLock);
|
||||
|
||||
SignalObjectAndWait(lock._get_win32_handle(), m_sema, INFINITE, FALSE);
|
||||
|
||||
EnterCriticalSection((CRITICAL_SECTION*)&m_waitersCountLock);
|
||||
m_waitersCount--;
|
||||
bool lastWaiter = m_wasBroadcast && m_waitersCount == 0;
|
||||
LeaveCriticalSection((CRITICAL_SECTION*)&m_waitersCountLock);
|
||||
|
||||
if (lastWaiter)
|
||||
{
|
||||
SignalObjectAndWait(m_waitersDone, lock._get_win32_handle(), INFINITE, FALSE);
|
||||
}
|
||||
else
|
||||
{
|
||||
WaitForSingleObject(lock._get_win32_handle(), INFINITE);
|
||||
}
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
bool CryConditionVariable::TimedWait(LockType& lock, uint32 millis)
|
||||
{
|
||||
EnterCriticalSection((CRITICAL_SECTION*)&m_waitersCountLock);
|
||||
m_waitersCount++;
|
||||
LeaveCriticalSection((CRITICAL_SECTION*)&m_waitersCountLock);
|
||||
|
||||
bool ok = true;
|
||||
if (WAIT_TIMEOUT == SignalObjectAndWait(lock._get_win32_handle(), m_sema, millis, FALSE))
|
||||
{
|
||||
ok = false;
|
||||
}
|
||||
|
||||
EnterCriticalSection((CRITICAL_SECTION*)&m_waitersCountLock);
|
||||
m_waitersCount--;
|
||||
bool lastWaiter = m_wasBroadcast && m_waitersCount == 0;
|
||||
LeaveCriticalSection((CRITICAL_SECTION*)&m_waitersCountLock);
|
||||
|
||||
if (lastWaiter)
|
||||
{
|
||||
SignalObjectAndWait(m_waitersDone, lock._get_win32_handle(), INFINITE, FALSE);
|
||||
}
|
||||
else
|
||||
{
|
||||
WaitForSingleObject(lock._get_win32_handle(), INFINITE);
|
||||
}
|
||||
|
||||
return ok;
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
void CryConditionVariable::NotifySingle()
|
||||
{
|
||||
EnterCriticalSection((CRITICAL_SECTION*)&m_waitersCountLock);
|
||||
bool haveWaiters = m_waitersCount > 0;
|
||||
LeaveCriticalSection((CRITICAL_SECTION*)&m_waitersCountLock);
|
||||
if (haveWaiters)
|
||||
{
|
||||
ReleaseSemaphore(m_sema, 1, 0);
|
||||
}
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
void CryConditionVariable::Notify()
|
||||
{
|
||||
EnterCriticalSection((CRITICAL_SECTION*)&m_waitersCountLock);
|
||||
bool haveWaiters = false;
|
||||
if (m_waitersCount > 0)
|
||||
{
|
||||
m_wasBroadcast = 1;
|
||||
haveWaiters = true;
|
||||
}
|
||||
if (haveWaiters)
|
||||
{
|
||||
ReleaseSemaphore(m_sema, m_waitersCount, 0);
|
||||
LeaveCriticalSection((CRITICAL_SECTION*)&m_waitersCountLock);
|
||||
WaitForSingleObject(m_waitersDone, INFINITE);
|
||||
m_wasBroadcast = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
LeaveCriticalSection((CRITICAL_SECTION*)&m_waitersCountLock);
|
||||
}
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
CrySemaphore::CrySemaphore(int nMaximumCount, int nInitialCount)
|
||||
{
|
||||
m_Semaphore = (void*)CreateSemaphore(NULL, nInitialCount, nMaximumCount, NULL);
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
CrySemaphore::~CrySemaphore()
|
||||
{
|
||||
CloseHandle((HANDLE)m_Semaphore);
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
void CrySemaphore::Acquire()
|
||||
{
|
||||
WaitForSingleObject((HANDLE)m_Semaphore, INFINITE);
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
void CrySemaphore::Release()
|
||||
{
|
||||
ReleaseSemaphore((HANDLE)m_Semaphore, 1, NULL);
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
CryFastSemaphore::CryFastSemaphore(int nMaximumCount, int nInitialCount)
|
||||
: m_Semaphore(nMaximumCount)
|
||||
, m_nCounter(nInitialCount)
|
||||
{
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
CryFastSemaphore::~CryFastSemaphore()
|
||||
{
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
void CryFastSemaphore::Acquire()
|
||||
{
|
||||
int nCount = ~0;
|
||||
do
|
||||
{
|
||||
nCount = *const_cast<volatile int*>(&m_nCounter);
|
||||
} while (CryInterlockedCompareExchange(alias_cast<volatile LONG*>(&m_nCounter), nCount - 1, nCount) != nCount);
|
||||
|
||||
// if the count would have been 0 or below, go to kernel semaphore
|
||||
if ((nCount - 1) < 0)
|
||||
{
|
||||
m_Semaphore.Acquire();
|
||||
}
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
void CryFastSemaphore::Release()
|
||||
{
|
||||
int nCount = ~0;
|
||||
do
|
||||
{
|
||||
nCount = *const_cast<volatile int*>(&m_nCounter);
|
||||
} while (CryInterlockedCompareExchange(alias_cast<volatile LONG*>(&m_nCounter), nCount + 1, nCount) != nCount);
|
||||
|
||||
// wake up kernel semaphore if we have waiter
|
||||
if (nCount < 0)
|
||||
{
|
||||
m_Semaphore.Release();
|
||||
}
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
CrySimpleThreadSelf::CrySimpleThreadSelf()
|
||||
: m_thread(NULL)
|
||||
, m_threadId(0)
|
||||
{
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
void CrySimpleThreadSelf::WaitForThread()
|
||||
{
|
||||
assert(m_thread);
|
||||
PREFAST_ASSUME(m_thread);
|
||||
if (GetCurrentThreadId() != m_threadId)
|
||||
{
|
||||
WaitForSingleObject((HANDLE)m_thread, INFINITE);
|
||||
}
|
||||
}
|
||||
|
||||
CrySimpleThreadSelf::~CrySimpleThreadSelf()
|
||||
{
|
||||
if (m_thread)
|
||||
{
|
||||
CloseHandle(m_thread);
|
||||
}
|
||||
}
|
||||
|
||||
void CrySimpleThreadSelf::StartThread(unsigned (__stdcall * func)(void*), void* argList)
|
||||
{
|
||||
#if defined(AZ_RESTRICTED_PLATFORM)
|
||||
#include AZ_RESTRICTED_FILE(CryThreadImpl_windows_h)
|
||||
#endif
|
||||
#if defined(AZ_RESTRICTED_SECTION_IMPLEMENTED)
|
||||
#undef AZ_RESTRICTED_SECTION_IMPLEMENTED
|
||||
#else
|
||||
m_thread = (void*)_beginthreadex(NULL, 0, func, argList, CREATE_SUSPENDED, &m_threadId);
|
||||
#endif
|
||||
assert(m_thread);
|
||||
PREFAST_ASSUME(m_thread);
|
||||
ResumeThread((HANDLE)m_thread);
|
||||
}
|
||||
@@ -1,152 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) Contributors to the Open 3D Engine Project.
|
||||
* For complete copyright and license terms please see the LICENSE at the root of this distribution.
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0 OR MIT
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#ifndef CRYINCLUDE_CRYCOMMON_CRYTHREAD_DUMMY_H
|
||||
#define CRYINCLUDE_CRYCOMMON_CRYTHREAD_DUMMY_H
|
||||
#pragma once
|
||||
|
||||
#include <AzCore/base.h>
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
CryEvent::CryEvent() {}
|
||||
CryEvent::~CryEvent() {}
|
||||
void CryEvent::Reset() {}
|
||||
void CryEvent::Set() {}
|
||||
void CryEvent::Wait() const {}
|
||||
bool CryEvent::Wait(const uint32 timeoutMillis) const {}
|
||||
typedef CryEvent CryEventTimed;
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
class _DummyLock
|
||||
{
|
||||
public:
|
||||
_DummyLock();
|
||||
|
||||
void Lock();
|
||||
bool TryLock();
|
||||
void Unlock();
|
||||
|
||||
#if defined(AZ_DEBUG_BUILD)
|
||||
bool IsLocked();
|
||||
#endif
|
||||
};
|
||||
|
||||
template<>
|
||||
class CryLock<CRYLOCK_FAST>
|
||||
: public _DummyLock
|
||||
{
|
||||
CryLock(const CryLock<CRYLOCK_FAST>&);
|
||||
void operator = (const CryLock<CRYLOCK_FAST>&);
|
||||
|
||||
public:
|
||||
CryLock();
|
||||
};
|
||||
|
||||
template<>
|
||||
class CryLock<CRYLOCK_RECURSIVE>
|
||||
: public _DummyLock
|
||||
{
|
||||
CryLock(const CryLock<CRYLOCK_RECURSIVE>&);
|
||||
void operator = (const CryLock<CRYLOCK_RECURSIVE>&);
|
||||
|
||||
public:
|
||||
CryLock();
|
||||
};
|
||||
|
||||
template<>
|
||||
class CryCondLock<CRYLOCK_FAST>
|
||||
: public CryLock<CRYLOCK_FAST>
|
||||
{
|
||||
};
|
||||
|
||||
template<>
|
||||
class CryCondLock<CRYLOCK_RECURSIVE>
|
||||
: public CryLock<CRYLOCK_FAST>
|
||||
{
|
||||
};
|
||||
|
||||
template<>
|
||||
class CryCond< CryLock<CRYLOCK_FAST> >
|
||||
{
|
||||
typedef CryLock<CRYLOCK_FAST> LockT;
|
||||
CryCond(const CryCond<LockT>&);
|
||||
void operator = (const CryCond<LockT>&);
|
||||
|
||||
public:
|
||||
CryCond();
|
||||
|
||||
void Notify();
|
||||
void NotifySingle();
|
||||
void Wait(LockT&);
|
||||
bool TimedWait(LockT &, uint32);
|
||||
};
|
||||
|
||||
template<>
|
||||
class CryCond< CryLock<CRYLOCK_RECURSIVE> >
|
||||
{
|
||||
typedef CryLock<CRYLOCK_RECURSIVE> LockT;
|
||||
CryCond(const CryCond<LockT>&);
|
||||
void operator = (const CryCond<LockT>&);
|
||||
|
||||
public:
|
||||
CryCond();
|
||||
|
||||
void Notify();
|
||||
void NotifySingle();
|
||||
void Wait(LockT&);
|
||||
bool TimedWait(LockT &, uint32);
|
||||
};
|
||||
|
||||
class _DummyRWLock
|
||||
{
|
||||
public:
|
||||
_DummyRWLock() { }
|
||||
|
||||
void RLock();
|
||||
bool TryRLock();
|
||||
void WLock();
|
||||
bool TryWLock();
|
||||
void Lock() { WLock(); }
|
||||
bool TryLock() { return TryWLock(); }
|
||||
void Unlock();
|
||||
};
|
||||
|
||||
template<class Runnable>
|
||||
class CrySimpleThread
|
||||
: public CryRunnable
|
||||
{
|
||||
public:
|
||||
typedef void (* ThreadFunction)(void*);
|
||||
|
||||
CrySimpleThread();
|
||||
virtual ~CrySimpleThread();
|
||||
#if !defined(NO_THREADINFO)
|
||||
CryThreadInfo& GetInfo();
|
||||
#endif
|
||||
const char* GetName();
|
||||
void SetName(const char*);
|
||||
|
||||
virtual void Run();
|
||||
virtual void Cancel();
|
||||
virtual void Start(Runnable&, unsigned = 0, const char* = NULL);
|
||||
virtual void Start(unsigned = 0, const char* = NULL);
|
||||
void StartFunction(ThreadFunction, void* = NULL, unsigned = 0);
|
||||
|
||||
void Exit();
|
||||
void Join();
|
||||
unsigned SetCpuMask(unsigned);
|
||||
unsigned GetCpuMask();
|
||||
|
||||
void Stop();
|
||||
bool IsStarted() const;
|
||||
bool IsRunning() const;
|
||||
};
|
||||
|
||||
#endif // CRYINCLUDE_CRYCOMMON_CRYTHREAD_DUMMY_H
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,387 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) Contributors to the Open 3D Engine Project.
|
||||
* For complete copyright and license terms please see the LICENSE at the root of this distribution.
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0 OR MIT
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <process.h>
|
||||
|
||||
#if defined(AZ_RESTRICTED_PLATFORM)
|
||||
#undef AZ_RESTRICTED_SECTION
|
||||
#define CRYTHREAD_WINDOWS_H_SECTION_1 1
|
||||
#define CRYTHREAD_WINDOWS_H_SECTION_2 2
|
||||
#endif
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// CryEvent represent a synchronization event
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
class CryEvent
|
||||
{
|
||||
public:
|
||||
CryEvent();
|
||||
~CryEvent();
|
||||
|
||||
// Reset the event to the unsignalled state.
|
||||
void Reset();
|
||||
// Set the event to the signalled state.
|
||||
void Set();
|
||||
// Access a HANDLE to wait on.
|
||||
void* GetHandle() const { return m_handle; };
|
||||
// Wait indefinitely for the object to become signalled.
|
||||
void Wait() const;
|
||||
// Wait, with a time limit, for the object to become signalled.
|
||||
bool Wait(const uint32 timeoutMillis) const;
|
||||
|
||||
private:
|
||||
CryEvent(const CryEvent&);
|
||||
CryEvent& operator = (const CryEvent&);
|
||||
|
||||
private:
|
||||
void* m_handle;
|
||||
};
|
||||
|
||||
typedef CryEvent CryEventTimed;
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// from winnt.h
|
||||
struct CRY_CRITICAL_SECTION
|
||||
{
|
||||
void* DebugInfo;
|
||||
long LockCount;
|
||||
long RecursionCount;
|
||||
threadID OwningThread;
|
||||
void* LockSemaphore;
|
||||
unsigned long* SpinCount; // force size on 64-bit systems when packed
|
||||
};
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
|
||||
// kernel mutex - don't use... use CryMutex instead
|
||||
class CryLock_WinMutex
|
||||
{
|
||||
public:
|
||||
CryLock_WinMutex();
|
||||
~CryLock_WinMutex();
|
||||
|
||||
void Lock();
|
||||
void Unlock();
|
||||
bool TryLock();
|
||||
|
||||
void* _get_win32_handle() { return m_hdl; }
|
||||
|
||||
private:
|
||||
CryLock_WinMutex(const CryLock_WinMutex&);
|
||||
CryLock_WinMutex& operator = (const CryLock_WinMutex&);
|
||||
|
||||
private:
|
||||
void* m_hdl;
|
||||
};
|
||||
|
||||
// critical section... don't use... use CryCriticalSection instead
|
||||
class CryLock_CritSection
|
||||
{
|
||||
public:
|
||||
CryLock_CritSection();
|
||||
~CryLock_CritSection();
|
||||
|
||||
void Lock();
|
||||
void Unlock();
|
||||
bool TryLock();
|
||||
|
||||
bool IsLocked()
|
||||
{
|
||||
return m_cs.RecursionCount > 0 && m_cs.OwningThread == CryGetCurrentThreadId();
|
||||
}
|
||||
|
||||
private:
|
||||
CryLock_CritSection(const CryLock_CritSection&);
|
||||
CryLock_CritSection& operator = (const CryLock_CritSection&);
|
||||
|
||||
private:
|
||||
CRY_CRITICAL_SECTION m_cs;
|
||||
};
|
||||
|
||||
template <>
|
||||
class CryLockT<CRYLOCK_RECURSIVE>
|
||||
: public CryLock_CritSection
|
||||
{
|
||||
};
|
||||
template <>
|
||||
class CryLockT<CRYLOCK_FAST>
|
||||
: public CryLock_CritSection
|
||||
{
|
||||
};
|
||||
class CryMutex
|
||||
: public CryLock_WinMutex
|
||||
{
|
||||
};
|
||||
#define _CRYTHREAD_CONDLOCK_GLITCH 1
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
class CryConditionVariable
|
||||
{
|
||||
public:
|
||||
typedef CryMutex LockType;
|
||||
|
||||
CryConditionVariable();
|
||||
~CryConditionVariable();
|
||||
void Wait(LockType& lock);
|
||||
bool TimedWait(LockType& lock, uint32 millis);
|
||||
void NotifySingle();
|
||||
void Notify();
|
||||
|
||||
private:
|
||||
CryConditionVariable(const CryConditionVariable&);
|
||||
CryConditionVariable& operator = (const CryConditionVariable&);
|
||||
|
||||
private:
|
||||
int m_waitersCount;
|
||||
CRY_CRITICAL_SECTION m_waitersCountLock;
|
||||
void* m_sema;
|
||||
void* m_waitersDone;
|
||||
size_t m_wasBroadcast;
|
||||
};
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// Platform independet wrapper for a counting semaphore
|
||||
class CrySemaphore
|
||||
{
|
||||
public:
|
||||
CrySemaphore(int nMaximumCount, int nInitialCount = 0);
|
||||
~CrySemaphore();
|
||||
void Acquire();
|
||||
void Release();
|
||||
|
||||
private:
|
||||
void* m_Semaphore;
|
||||
};
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// Platform independet wrapper for a counting semaphore
|
||||
// except that this version uses C-A-S only until a blocking call is needed
|
||||
// -> No kernel call if there are object in the semaphore
|
||||
class CryFastSemaphore
|
||||
{
|
||||
public:
|
||||
CryFastSemaphore(int nMaximumCount, int nInitialCount = 0);
|
||||
~CryFastSemaphore();
|
||||
void Acquire();
|
||||
void Release();
|
||||
|
||||
private:
|
||||
CrySemaphore m_Semaphore;
|
||||
volatile int32 m_nCounter;
|
||||
};
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
class CrySimpleThreadSelf
|
||||
{
|
||||
public:
|
||||
CrySimpleThreadSelf();
|
||||
void WaitForThread();
|
||||
virtual ~CrySimpleThreadSelf();
|
||||
protected:
|
||||
void StartThread(unsigned (__stdcall * func)(void*), void* argList);
|
||||
static AZ_THREAD_LOCAL CrySimpleThreadSelf* m_Self;
|
||||
private:
|
||||
CrySimpleThreadSelf(const CrySimpleThreadSelf&);
|
||||
CrySimpleThreadSelf& operator = (const CrySimpleThreadSelf&);
|
||||
protected:
|
||||
void* m_thread;
|
||||
uint32 m_threadId;
|
||||
};
|
||||
|
||||
template<class Runnable>
|
||||
class CrySimpleThread
|
||||
: public CryRunnable
|
||||
, public CrySimpleThreadSelf
|
||||
{
|
||||
public:
|
||||
typedef void (* ThreadFunction)(void*);
|
||||
typedef CryRunnable RunnableT;
|
||||
|
||||
void SetName(const char* Name)
|
||||
{
|
||||
m_name = Name;
|
||||
}
|
||||
const char* GetName() { return m_name; }
|
||||
|
||||
const volatile bool& GetStartedState() const { return m_bIsStarted; }
|
||||
|
||||
private:
|
||||
Runnable* m_Runnable;
|
||||
struct
|
||||
{
|
||||
ThreadFunction m_ThreadFunction;
|
||||
void* m_ThreadParameter;
|
||||
} m_ThreadFunction;
|
||||
volatile bool m_bIsStarted;
|
||||
volatile bool m_bIsRunning;
|
||||
volatile bool m_bCreatedThread;
|
||||
AZStd::string m_name;
|
||||
|
||||
protected:
|
||||
virtual void Terminate()
|
||||
{
|
||||
// This method must be empty.
|
||||
// Derived classes overriding Terminate() are not required to call this
|
||||
// method.
|
||||
}
|
||||
|
||||
private:
|
||||
static unsigned __stdcall RunRunnable(void* thisPtr)
|
||||
{
|
||||
#if defined(AZ_RESTRICTED_PLATFORM)
|
||||
#define AZ_RESTRICTED_SECTION CRYTHREAD_WINDOWS_H_SECTION_1
|
||||
#include AZ_RESTRICTED_FILE(CryThread_windows_h)
|
||||
#endif
|
||||
CrySimpleThread<Runnable>* const self = (CrySimpleThread<Runnable>*)thisPtr;
|
||||
self->m_bIsStarted = true;
|
||||
self->m_bIsRunning = true;
|
||||
|
||||
self->m_Runnable->Run();
|
||||
self->m_bIsRunning = false;
|
||||
self->m_bCreatedThread = false;
|
||||
self->Terminate();
|
||||
return 0;
|
||||
}
|
||||
|
||||
static unsigned __stdcall RunThis(void* thisPtr)
|
||||
{
|
||||
#if defined(AZ_RESTRICTED_PLATFORM)
|
||||
#define AZ_RESTRICTED_SECTION CRYTHREAD_WINDOWS_H_SECTION_2
|
||||
#include AZ_RESTRICTED_FILE(CryThread_windows_h)
|
||||
#endif
|
||||
CrySimpleThread<Runnable>* const self = (CrySimpleThread<Runnable>*)thisPtr;
|
||||
self->m_bIsStarted = true;
|
||||
self->m_bIsRunning = true;
|
||||
|
||||
self->Run();
|
||||
self->m_bIsRunning = false;
|
||||
self->m_bCreatedThread = false;
|
||||
self->Terminate();
|
||||
return 0;
|
||||
}
|
||||
|
||||
CrySimpleThread(const CrySimpleThread<Runnable>&);
|
||||
void operator = (const CrySimpleThread<Runnable>&);
|
||||
|
||||
public:
|
||||
CrySimpleThread()
|
||||
: m_bIsStarted(false)
|
||||
, m_bIsRunning(false)
|
||||
, m_bCreatedThread(false)
|
||||
{
|
||||
m_thread = NULL;
|
||||
m_Runnable = NULL;
|
||||
}
|
||||
void* GetHandle() { return m_thread; }
|
||||
|
||||
virtual ~CrySimpleThread()
|
||||
{
|
||||
if (IsStarted())
|
||||
{
|
||||
if (gEnv && gEnv->pLog)
|
||||
{
|
||||
gEnv->pLog->LogError("Runaway thread %p '%s'", m_thread, m_name.c_str());
|
||||
}
|
||||
}
|
||||
|
||||
if (m_bCreatedThread)
|
||||
{
|
||||
Cancel();
|
||||
WaitForThread();
|
||||
}
|
||||
}
|
||||
|
||||
virtual void Run()
|
||||
{
|
||||
// This Run() implementation supports the void StartFunction() method.
|
||||
// However, code using this class (or derived classes) should eventually
|
||||
// be refactored to use one of the other Start() methods. This code will
|
||||
// be removed some day and the default implementation of Run() will be
|
||||
// empty.
|
||||
if (m_ThreadFunction.m_ThreadFunction != NULL)
|
||||
{
|
||||
m_ThreadFunction.m_ThreadFunction(m_ThreadFunction.m_ThreadParameter);
|
||||
}
|
||||
}
|
||||
|
||||
// Cancel the running thread.
|
||||
//
|
||||
// If the thread class is implemented as a derived class of CrySimpleThread,
|
||||
// then the derived class should provide an appropriate implementation for
|
||||
// this method. Calling the base class implementation is _not_ required.
|
||||
//
|
||||
// If the thread was started by specifying a Runnable (template argument),
|
||||
// then the Cancel() call is passed on to the specified runnable.
|
||||
//
|
||||
// If the thread was started using the StartFunction() method, then the
|
||||
// caller must find other means to inform the thread about the cancellation
|
||||
// request.
|
||||
virtual void Cancel()
|
||||
{
|
||||
if (IsStarted() && m_Runnable != NULL)
|
||||
{
|
||||
m_Runnable->Cancel();
|
||||
}
|
||||
}
|
||||
|
||||
virtual void Start(Runnable& runnable, [[maybe_unused]] unsigned cpuMask = 0, const char* = NULL, int32 = 0)
|
||||
{
|
||||
if (m_bCreatedThread)
|
||||
{
|
||||
// Don't start thread more than once!
|
||||
return;
|
||||
}
|
||||
m_Runnable = &runnable;
|
||||
m_bCreatedThread = true;
|
||||
StartThread(RunRunnable, this);
|
||||
}
|
||||
|
||||
virtual void Start([[maybe_unused]] unsigned cpuMask = 0, const char* = NULL, int32 = 0, int32 = 0)
|
||||
{
|
||||
if (m_bCreatedThread)
|
||||
{
|
||||
// Don't start thread more than once!
|
||||
return;
|
||||
}
|
||||
m_bCreatedThread = true;
|
||||
StartThread(RunThis, this);
|
||||
}
|
||||
|
||||
void StartFunction(
|
||||
ThreadFunction threadFunction,
|
||||
void* threadParameter = NULL
|
||||
)
|
||||
{
|
||||
m_ThreadFunction.m_ThreadFunction = threadFunction;
|
||||
m_ThreadFunction.m_ThreadParameter = threadParameter;
|
||||
Start();
|
||||
}
|
||||
|
||||
static CrySimpleThread<Runnable>* Self()
|
||||
{
|
||||
return reinterpret_cast<CrySimpleThread<Runnable>*>(m_Self);
|
||||
}
|
||||
|
||||
void Exit()
|
||||
{
|
||||
assert(!"implemented");
|
||||
}
|
||||
|
||||
void Stop()
|
||||
{
|
||||
m_bIsStarted = false;
|
||||
}
|
||||
|
||||
bool IsStarted() const { return m_bIsStarted; }
|
||||
bool IsRunning() const { return m_bIsRunning; }
|
||||
};
|
||||
@@ -14,7 +14,7 @@
|
||||
#define CRYINCLUDE_CRYCOMMON_IFUNCTORBASE_H
|
||||
#pragma once
|
||||
|
||||
#include <CryCommon/CryThread.h>
|
||||
#include <AzCore/std/parallel/atomic.h>
|
||||
|
||||
// Base class for functor storage.
|
||||
// Not intended for direct usage.
|
||||
@@ -28,19 +28,19 @@ public:
|
||||
|
||||
void AddRef()
|
||||
{
|
||||
CryInterlockedIncrement(&m_nReferences);
|
||||
m_nReferences.fetch_add(1, AZStd::memory_order_acq_rel);
|
||||
}
|
||||
|
||||
void Release()
|
||||
{
|
||||
if (CryInterlockedDecrement(&m_nReferences) <= 0)
|
||||
if (m_nReferences.fetch_sub(1, AZStd::memory_order_acq_rel) == 1)
|
||||
{
|
||||
delete this;
|
||||
}
|
||||
}
|
||||
|
||||
protected:
|
||||
volatile int m_nReferences;
|
||||
AZStd::atomic_int m_nReferences;
|
||||
};
|
||||
|
||||
// Base Template for specialization.
|
||||
|
||||
@@ -6,13 +6,6 @@
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
// In Mac, including ILog without including platform.h first fails because platform.h
|
||||
// includes CryThread.h which includes CryThread_pthreads.h which uses ILog.
|
||||
// So plaform.h needs the contents of ILog.h.
|
||||
// By including platform.h outside of the guard, we give platform.h the right include order
|
||||
#include <platform.h>
|
||||
|
||||
#ifndef CRYINCLUDE_CRYCOMMON_ILOG_H
|
||||
#define CRYINCLUDE_CRYCOMMON_ILOG_H
|
||||
#pragma once
|
||||
|
||||
@@ -37,7 +37,6 @@ struct IRenderMesh;
|
||||
#include <IXml.h>
|
||||
#include <smartptr.h>
|
||||
#include <AzCore/EBus/EBus.h>
|
||||
#include <CryThread.h>
|
||||
|
||||
#ifdef MAX_SUB_MATERIALS
|
||||
// This checks that the values are in sync in the different files.
|
||||
@@ -433,8 +432,6 @@ struct IMaterial
|
||||
virtual uint32 GetDccMaterialHash() const = 0;
|
||||
virtual void SetDccMaterialHash(uint32 hash) = 0;
|
||||
|
||||
virtual CryCriticalSection& GetSubMaterialResizeLock() = 0;
|
||||
|
||||
virtual void UpdateShaderItems() = 0;
|
||||
|
||||
// </interfuscator:shuffle>
|
||||
|
||||
@@ -6,13 +6,6 @@
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
// In Mac, including ISystem without including platform.h first fails because platform.h
|
||||
// includes CryThread.h which includes CryThread_pthreads.h which uses ISystem (gEnv).
|
||||
// So plaform.h needs the contents of ISystem.h.
|
||||
// By including platform.h outside of the guard, we give platform.h the right include order
|
||||
#include <platform.h> // Needed for LARGE_INTEGER (for consoles).
|
||||
|
||||
#ifndef CRYINCLUDE_CRYCOMMON_ISYSTEM_H
|
||||
#define CRYINCLUDE_CRYCOMMON_ISYSTEM_H
|
||||
#pragma once
|
||||
|
||||
@@ -413,67 +413,12 @@ inline void SetLastError(DWORD dwErrCode) { errno = dwErrCode; }
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
extern threadID GetCurrentThreadId();
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
extern HANDLE CreateEvent(
|
||||
LPSECURITY_ATTRIBUTES lpEventAttributes,
|
||||
BOOL bManualReset,
|
||||
BOOL bInitialState,
|
||||
LPCSTR lpName
|
||||
);
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
extern DWORD Sleep(DWORD dwMilliseconds);
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
extern DWORD SleepEx(DWORD dwMilliseconds, BOOL bAlertable);
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
extern DWORD WaitForSingleObjectEx(
|
||||
HANDLE hHandle,
|
||||
DWORD dwMilliseconds,
|
||||
BOOL bAlertable);
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
extern DWORD WaitForMultipleObjectsEx(
|
||||
DWORD nCount,
|
||||
const HANDLE* lpHandles,
|
||||
BOOL bWaitAll,
|
||||
DWORD dwMilliseconds,
|
||||
BOOL bAlertable);
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
extern DWORD WaitForSingleObject(HANDLE hHandle, DWORD dwMilliseconds);
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
extern BOOL SetEvent(HANDLE hEvent);
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
extern BOOL ResetEvent(HANDLE hEvent);
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
extern HANDLE CreateMutex(
|
||||
LPSECURITY_ATTRIBUTES lpMutexAttributes,
|
||||
BOOL bInitialOwner,
|
||||
LPCSTR lpName
|
||||
);
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
extern BOOL ReleaseMutex(HANDLE hMutex);
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
typedef DWORD (* PTHREAD_START_ROUTINE)(LPVOID lpThreadParameter);
|
||||
typedef PTHREAD_START_ROUTINE LPTHREAD_START_ROUTINE;
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
extern HANDLE CreateThread(
|
||||
LPSECURITY_ATTRIBUTES lpThreadAttributes,
|
||||
SIZE_T dwStackSize,
|
||||
LPTHREAD_START_ROUTINE lpStartAddress,
|
||||
LPVOID lpParameter,
|
||||
DWORD dwCreationFlags,
|
||||
LPDWORD lpThreadId
|
||||
);
|
||||
|
||||
extern BOOL GetComputerName(LPSTR lpBuffer, LPDWORD lpnSize); //required for CryOnline
|
||||
extern DWORD GetCurrentProcessId(void);
|
||||
|
||||
|
||||
@@ -1,285 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) Contributors to the Open 3D Engine Project.
|
||||
* For complete copyright and license terms please see the LICENSE at the root of this distribution.
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0 OR MIT
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#pragma once
|
||||
|
||||
#if defined(APPLE) || defined(LINUX)
|
||||
#include <sched.h>
|
||||
#endif
|
||||
|
||||
#include <AzCore/std/parallel/mutex.h>
|
||||
|
||||
#include "CryAssert.h"
|
||||
|
||||
// Section dictionary
|
||||
#if defined(AZ_RESTRICTED_PLATFORM)
|
||||
#define MULTITHREAD_H_SECTION_TRAITS 1
|
||||
#define MULTITHREAD_H_SECTION_DEFINE_CRYINTERLOCKEXCHANGE 2
|
||||
#define MULTITHREAD_H_SECTION_IMPLEMENT_CRYSPINLOCK 3
|
||||
#define MULTITHREAD_H_SECTION_IMPLEMENT_CRYINTERLOCKEDADD 4
|
||||
#define MULTITHREAD_H_SECTION_IMPLEMENT_CRYINTERLOCKEDADDSIZE 5
|
||||
#define MULTITHREAD_H_SECTION_CRYINTERLOCKEDFLUSHSLIST_PT1 6
|
||||
#define MULTITHREAD_H_SECTION_CRYINTERLOCKEDFLUSHSLIST_PT2 7
|
||||
#define MULTITHREAD_H_SECTION_IMPLEMENT_CRYINTERLOCKEDCOMPAREEXCHANGE64 8
|
||||
#endif
|
||||
|
||||
#define WRITE_LOCK_VAL (1 << 16)
|
||||
|
||||
// Traits
|
||||
#if defined(AZ_RESTRICTED_PLATFORM)
|
||||
#define AZ_RESTRICTED_SECTION MULTITHREAD_H_SECTION_TRAITS
|
||||
#include AZ_RESTRICTED_FILE(MultiThread_h)
|
||||
#endif
|
||||
|
||||
void CrySpinLock(volatile int* pLock, int checkVal, int setVal);
|
||||
void CryReleaseSpinLock (volatile int*, int);
|
||||
|
||||
LONG CryInterlockedIncrement(int volatile* lpAddend);
|
||||
LONG CryInterlockedDecrement(int volatile* lpAddend);
|
||||
LONG CryInterlockedOr(LONG volatile* Destination, LONG Value);
|
||||
LONG CryInterlockedExchangeAdd(LONG volatile* lpAddend, LONG Value);
|
||||
LONG CryInterlockedCompareExchange(LONG volatile* dst, LONG exchange, LONG comperand);
|
||||
void* CryInterlockedCompareExchangePointer(void* volatile* dst, void* exchange, void* comperand);
|
||||
void* CryInterlockedExchangePointer (void* volatile* dst, void* exchange);
|
||||
|
||||
void* CryCreateCriticalSection();
|
||||
void CryCreateCriticalSectionInplace(void*);
|
||||
void CryDeleteCriticalSection(void* cs);
|
||||
void CryDeleteCriticalSectionInplace(void* cs);
|
||||
void CryEnterCriticalSection(void* cs);
|
||||
bool CryTryCriticalSection(void* cs);
|
||||
void CryLeaveCriticalSection(void* cs);
|
||||
|
||||
#if defined(AZ_RESTRICTED_PLATFORM)
|
||||
#define AZ_RESTRICTED_SECTION MULTITHREAD_H_SECTION_DEFINE_CRYINTERLOCKEXCHANGE
|
||||
#include AZ_RESTRICTED_FILE(MultiThread_h)
|
||||
#endif
|
||||
|
||||
ILINE void CrySpinLock(volatile int* pLock, int checkVal, int setVal)
|
||||
{
|
||||
#ifdef _CPU_X86
|
||||
# ifdef __GNUC__
|
||||
int val;
|
||||
__asm__ __volatile__ (
|
||||
"0: mov %[checkVal], %%eax\n"
|
||||
" lock cmpxchg %[setVal], (%[pLock])\n"
|
||||
" jnz 0b"
|
||||
: "=m" (*pLock)
|
||||
: [pLock] "r" (pLock), "m" (*pLock),
|
||||
[checkVal] "m" (checkVal),
|
||||
[setVal] "r" (setVal)
|
||||
: "eax", "cc", "memory"
|
||||
);
|
||||
# else //!__GNUC__
|
||||
__asm
|
||||
{
|
||||
mov edx, setVal
|
||||
mov ecx, pLock
|
||||
Spin:
|
||||
// Trick from Intel Optimizations guide
|
||||
#ifdef _CPU_SSE
|
||||
pause
|
||||
#endif
|
||||
mov eax, checkVal
|
||||
lock cmpxchg [ecx], edx
|
||||
jnz Spin
|
||||
}
|
||||
# endif //!__GNUC__
|
||||
#else // !_CPU_X86
|
||||
# if defined(AZ_RESTRICTED_PLATFORM)
|
||||
#define AZ_RESTRICTED_SECTION MULTITHREAD_H_SECTION_IMPLEMENT_CRYSPINLOCK
|
||||
#include AZ_RESTRICTED_FILE(MultiThread_h)
|
||||
# endif
|
||||
# if defined(AZ_RESTRICTED_SECTION_IMPLEMENTED)
|
||||
# undef AZ_RESTRICTED_SECTION_IMPLEMENTED
|
||||
# elif defined(APPLE) || defined(LINUX)
|
||||
// register int val;
|
||||
// __asm__ __volatile__ (
|
||||
// "0: mov %[checkVal], %%eax\n"
|
||||
// " lock cmpxchg %[setVal], (%[pLock])\n"
|
||||
// " jnz 0b"
|
||||
// : "=m" (*pLock)
|
||||
// : [pLock] "r" (pLock), "m" (*pLock),
|
||||
// [checkVal] "m" (checkVal),
|
||||
// [setVal] "r" (setVal)
|
||||
// : "eax", "cc", "memory"
|
||||
// );
|
||||
//while(CryInterlockedCompareExchange((volatile long*)pLock,setVal,checkVal)!=checkVal) ;
|
||||
uint loops = 0;
|
||||
while (__sync_val_compare_and_swap((volatile int32_t*)pLock, (int32_t)checkVal, (int32_t)setVal) != checkVal)
|
||||
{
|
||||
# if !defined (ANDROID) && !defined(IOS)
|
||||
_mm_pause();
|
||||
# endif
|
||||
|
||||
if (!(++loops & 0x7F))
|
||||
{
|
||||
usleep(1); // give threads with other prio chance to run
|
||||
}
|
||||
else if (!(loops & 0x3F))
|
||||
{
|
||||
sched_yield(); // give threads with same prio chance to run
|
||||
}
|
||||
}
|
||||
# else
|
||||
// NOTE: The code below will fail on 64bit architectures!
|
||||
while (_InterlockedCompareExchange((volatile LONG*)pLock, setVal, checkVal) != checkVal)
|
||||
{
|
||||
_mm_pause();
|
||||
}
|
||||
# endif
|
||||
#endif
|
||||
}
|
||||
|
||||
ILINE void CryReleaseSpinLock(volatile int* pLock, int setVal)
|
||||
{
|
||||
*pLock = setVal;
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
ILINE void CryInterlockedAdd(volatile int* pVal, int iAdd)
|
||||
{
|
||||
#ifdef _CPU_X86
|
||||
# ifdef __GNUC__
|
||||
__asm__ __volatile__ (
|
||||
" lock add %[iAdd], (%[pVal])\n"
|
||||
: "=m" (*pVal)
|
||||
: [pVal] "r" (pVal), "m" (*pVal), [iAdd] "r" (iAdd)
|
||||
);
|
||||
# else
|
||||
__asm
|
||||
{
|
||||
mov edx, pVal
|
||||
mov eax, iAdd
|
||||
lock add [edx], eax
|
||||
}
|
||||
# endif
|
||||
#else
|
||||
// NOTE: The code below will fail on 64bit architectures!
|
||||
#if defined(_WIN64)
|
||||
_InterlockedExchangeAdd((volatile LONG*)pVal, iAdd);
|
||||
#define AZ_RESTRICTED_SECTION_IMPLEMENTED
|
||||
#elif defined(AZ_RESTRICTED_PLATFORM)
|
||||
#define AZ_RESTRICTED_SECTION MULTITHREAD_H_SECTION_IMPLEMENT_CRYINTERLOCKEDADD
|
||||
#include AZ_RESTRICTED_FILE(MultiThread_h)
|
||||
#endif
|
||||
#if defined(AZ_RESTRICTED_SECTION_IMPLEMENTED)
|
||||
#undef AZ_RESTRICTED_SECTION_IMPLEMENTED
|
||||
#elif defined(APPLE) || defined(LINUX)
|
||||
CryInterlockedExchangeAdd((volatile LONG*)pVal, iAdd);
|
||||
#elif defined(APPLE)
|
||||
OSAtomicAdd32(iAdd, (volatile LONG*)pVal);
|
||||
#else
|
||||
InterlockedExchangeAdd((volatile LONG*)pVal, iAdd);
|
||||
#endif
|
||||
|
||||
#endif
|
||||
}
|
||||
|
||||
ILINE void CryInterlockedAddSize(volatile size_t* pVal, ptrdiff_t iAdd)
|
||||
{
|
||||
#if defined(PLATFORM_64BIT)
|
||||
#if defined(_WIN64)
|
||||
_InterlockedExchangeAdd64((volatile __int64*)pVal, iAdd);
|
||||
#define AZ_RESTRICTED_SECTION_IMPLEMENTED
|
||||
#elif defined(AZ_RESTRICTED_PLATFORM)
|
||||
#define AZ_RESTRICTED_SECTION MULTITHREAD_H_SECTION_IMPLEMENT_CRYINTERLOCKEDADDSIZE
|
||||
#include AZ_RESTRICTED_FILE(MultiThread_h)
|
||||
#endif
|
||||
#if defined(AZ_RESTRICTED_SECTION_IMPLEMENTED)
|
||||
#undef AZ_RESTRICTED_SECTION_IMPLEMENTED
|
||||
#elif defined(WIN32)
|
||||
InterlockedExchangeAdd64((volatile LONG64*)pVal, iAdd);
|
||||
#elif defined(APPLE) || defined(LINUX)
|
||||
(void)__sync_fetch_and_add((int64_t*)pVal, (int64_t)iAdd);
|
||||
#else
|
||||
int64 x, n;
|
||||
do
|
||||
{
|
||||
x = (int64) * pVal;
|
||||
n = x + iAdd;
|
||||
}
|
||||
while (CryInterlockedCompareExchange64((volatile int64*)pVal, n, x) != x);
|
||||
#endif
|
||||
#else
|
||||
CryInterlockedAdd((volatile int*)pVal, (int)iAdd);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
ILINE void CryWriteLock(volatile int* rw)
|
||||
{
|
||||
CrySpinLock(rw, 0, WRITE_LOCK_VAL);
|
||||
}
|
||||
|
||||
ILINE void CryReleaseWriteLock(volatile int* rw)
|
||||
{
|
||||
CryInterlockedAdd(rw, -WRITE_LOCK_VAL);
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
struct WriteLock
|
||||
{
|
||||
ILINE WriteLock(volatile int& rw) { CryWriteLock(&rw); prw = &rw; }
|
||||
~WriteLock() { CryReleaseWriteLock(prw); }
|
||||
private:
|
||||
volatile int* prw;
|
||||
};
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
struct WriteLockCond
|
||||
{
|
||||
ILINE WriteLockCond(volatile int& rw, int bActive = 1)
|
||||
{
|
||||
if (bActive)
|
||||
{
|
||||
CrySpinLock(&rw, 0, iActive = WRITE_LOCK_VAL);
|
||||
}
|
||||
else
|
||||
{
|
||||
iActive = 0;
|
||||
}
|
||||
prw = &rw;
|
||||
}
|
||||
ILINE WriteLockCond() { prw = &(iActive = 0); }
|
||||
~WriteLockCond()
|
||||
{
|
||||
CryInterlockedAdd(prw, -iActive);
|
||||
}
|
||||
void SetActive(int bActive = 1) { iActive = -bActive & WRITE_LOCK_VAL; }
|
||||
void Release() { CryInterlockedAdd(prw, -iActive); }
|
||||
volatile int* prw;
|
||||
int iActive;
|
||||
};
|
||||
|
||||
|
||||
#if defined(LINUX) || defined(APPLE)
|
||||
ILINE int64 CryInterlockedCompareExchange64(volatile int64* addr, int64 exchange, int64 comperand)
|
||||
{
|
||||
return __sync_val_compare_and_swap(addr, comperand, exchange);
|
||||
// This is OK, because long is signed int64 on Linux x86_64
|
||||
//return CryInterlockedCompareExchange((volatile long*)addr, (long)exchange, (long)comperand);
|
||||
}
|
||||
#else
|
||||
ILINE int64 CryInterlockedCompareExchange64(volatile int64* addr, int64 exchange, int64 compare)
|
||||
{
|
||||
// forward to system call
|
||||
#if defined(AZ_RESTRICTED_PLATFORM)
|
||||
#define AZ_RESTRICTED_SECTION MULTITHREAD_H_SECTION_IMPLEMENT_CRYINTERLOCKEDCOMPAREEXCHANGE64
|
||||
#include AZ_RESTRICTED_FILE(MultiThread_h)
|
||||
#endif
|
||||
#if defined(AZ_RESTRICTED_SECTION_IMPLEMENTED)
|
||||
#undef AZ_RESTRICTED_SECTION_IMPLEMENTED
|
||||
#else
|
||||
return _InterlockedCompareExchange64((volatile int64*)addr, exchange, compare);
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
@@ -34,7 +34,7 @@ namespace CryMT
|
||||
public:
|
||||
typedef T value_type;
|
||||
typedef std::vector<T, Alloc> container_type;
|
||||
typedef CryAutoCriticalSection AutoLock;
|
||||
typedef AZStd::lock_guard<AZStd::recursive_mutex> AutoLock;
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// std::queue interface
|
||||
@@ -46,7 +46,7 @@ namespace CryMT
|
||||
// classic pop function of queue should not be used for thread safety, use try_pop instead
|
||||
//void pop() { AutoLock lock(m_cs); return v.erase(v.begin()); };
|
||||
|
||||
CryCriticalSection& get_lock() const { return m_cs; }
|
||||
AZStd::recursive_mutex& get_lock() const { return m_cs; }
|
||||
|
||||
bool empty() const { AutoLock lock(m_cs); return v.empty(); }
|
||||
int size() const { AutoLock lock(m_cs); return v.size(); }
|
||||
@@ -92,7 +92,7 @@ namespace CryMT
|
||||
}
|
||||
private:
|
||||
container_type v;
|
||||
mutable CryCriticalSection m_cs;
|
||||
mutable AZStd::recursive_mutex m_cs;
|
||||
};
|
||||
}; // namespace CryMT
|
||||
|
||||
|
||||
@@ -21,8 +21,7 @@
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
#include "MultiThread.h"
|
||||
#include "CryThread.h"
|
||||
#include <AzCore/std/parallel/spin_mutex.h>
|
||||
|
||||
namespace stl
|
||||
{
|
||||
@@ -52,43 +51,20 @@ namespace stl
|
||||
|
||||
struct PSyncMultiThread
|
||||
{
|
||||
PSyncMultiThread()
|
||||
: _Semaphore(0) {}
|
||||
PSyncMultiThread() {}
|
||||
|
||||
void Lock()
|
||||
{
|
||||
CryWriteLock(&_Semaphore);
|
||||
m_lock.lock();
|
||||
}
|
||||
void Unlock()
|
||||
{
|
||||
CryReleaseWriteLock(&_Semaphore);
|
||||
}
|
||||
int IsLocked() const volatile
|
||||
{
|
||||
return _Semaphore;
|
||||
m_lock.unlock();
|
||||
}
|
||||
|
||||
private:
|
||||
volatile int _Semaphore;
|
||||
AZStd::spin_mutex m_lock;
|
||||
};
|
||||
|
||||
#ifdef _DEBUG
|
||||
|
||||
struct PSyncDebug
|
||||
: public PSyncMultiThread
|
||||
{
|
||||
void Lock()
|
||||
{
|
||||
assert(!IsLocked());
|
||||
PSyncMultiThread::Lock();
|
||||
}
|
||||
};
|
||||
|
||||
#else
|
||||
|
||||
typedef PSyncNone PSyncDebug;
|
||||
|
||||
#endif
|
||||
};
|
||||
|
||||
#endif // CRYINCLUDE_CRYCOMMON_SYNCHRONIZATION_H
|
||||
|
||||
@@ -923,21 +923,6 @@ threadID GetCurrentThreadId()
|
||||
}
|
||||
#endif
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
HANDLE CreateEvent
|
||||
(
|
||||
LPSECURITY_ATTRIBUTES lpEventAttributes,
|
||||
BOOL bManualReset,
|
||||
BOOL bInitialState,
|
||||
LPCSTR lpName
|
||||
)
|
||||
{
|
||||
//TODO: implement
|
||||
CRY_ASSERT_MESSAGE(0, "CreateEvent not implemented yet");
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
DWORD Sleep(DWORD dwMilliseconds)
|
||||
{
|
||||
@@ -1003,95 +988,6 @@ DWORD SleepEx(DWORD dwMilliseconds, BOOL bAlertable)
|
||||
return 0;
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
DWORD WaitForSingleObjectEx(HANDLE hHandle, DWORD dwMilliseconds, BOOL bAlertable)
|
||||
{
|
||||
//TODO: implement
|
||||
CRY_ASSERT_MESSAGE(0, "WaitForSingleObjectEx not implemented yet");
|
||||
return 0;
|
||||
}
|
||||
|
||||
#if 0
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
DWORD WaitForMultipleObjectsEx(
|
||||
DWORD nCount,
|
||||
const HANDLE* lpHandles,
|
||||
BOOL bWaitAll,
|
||||
DWORD dwMilliseconds,
|
||||
BOOL bAlertable)
|
||||
{
|
||||
//TODO: implement
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
DWORD WaitForSingleObject(HANDLE hHandle, DWORD dwMilliseconds)
|
||||
{
|
||||
//TODO: implement
|
||||
CRY_ASSERT_MESSAGE(0, "WaitForSingleObject not implemented yet");
|
||||
return 0;
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
BOOL SetEvent(HANDLE hEvent)
|
||||
{
|
||||
//TODO: implement
|
||||
CRY_ASSERT_MESSAGE(0, "SetEvent not implemented yet");
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
BOOL ResetEvent(HANDLE hEvent)
|
||||
{
|
||||
//TODO: implement
|
||||
CRY_ASSERT_MESSAGE(0, "ResetEvent not implemented yet");
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
HANDLE CreateMutex
|
||||
(
|
||||
LPSECURITY_ATTRIBUTES lpMutexAttributes,
|
||||
BOOL bInitialOwner,
|
||||
LPCSTR lpName
|
||||
)
|
||||
{
|
||||
//TODO: implement
|
||||
CRY_ASSERT_MESSAGE(0, "CreateMutex not implemented yet");
|
||||
return 0;
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
BOOL ReleaseMutex(HANDLE hMutex)
|
||||
{
|
||||
//TODO: implement
|
||||
CRY_ASSERT_MESSAGE(0, "ReleaseMutex not implemented yet");
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
typedef DWORD (* PTHREAD_START_ROUTINE)(LPVOID lpThreadParameter);
|
||||
typedef PTHREAD_START_ROUTINE LPTHREAD_START_ROUTINE;
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
HANDLE CreateThread
|
||||
(
|
||||
LPSECURITY_ATTRIBUTES lpThreadAttributes,
|
||||
SIZE_T dwStackSize,
|
||||
LPTHREAD_START_ROUTINE lpStartAddress,
|
||||
LPVOID lpParameter,
|
||||
DWORD dwCreationFlags,
|
||||
LPDWORD lpThreadId
|
||||
)
|
||||
{
|
||||
//TODO: implement
|
||||
CRY_ASSERT_MESSAGE(0, "CreateThread not implemented yet");
|
||||
return 0;
|
||||
}
|
||||
|
||||
#if defined(LINUX) || defined(APPLE)
|
||||
BOOL GetComputerName(LPSTR lpBuffer, LPDWORD lpnSize)
|
||||
{
|
||||
@@ -1270,90 +1166,7 @@ int CryMessageBox(const char* lpText, const char* lpCaption, unsigned int uType)
|
||||
#endif
|
||||
}
|
||||
|
||||
#if defined(LINUX) || defined(APPLE) || defined(DEFINE_CRY_INTERLOCKED_INCREMENT)
|
||||
//[K01]: http://www.memoryhole.net/kyle/2007/05/atomic_incrementing.html
|
||||
//http://forums.devx.com/archive/index.php/t-160558.html
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
DLL_EXPORT LONG CryInterlockedIncrement(LONG volatile* lpAddend)
|
||||
{
|
||||
/*int r;
|
||||
__asm__ __volatile__ (
|
||||
"lock ; xaddl %0, (%1) \n\t"
|
||||
: "=r" (r)
|
||||
: "r" (lpAddend), "0" (1)
|
||||
: "memory"
|
||||
);
|
||||
return (LONG) (r + 1); */// add, since we get the original value back.
|
||||
return __sync_fetch_and_add(lpAddend, 1) + 1;
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
DLL_EXPORT LONG CryInterlockedDecrement(LONG volatile* lpAddend)
|
||||
{
|
||||
/*int r;
|
||||
__asm__ __volatile__ (
|
||||
"lock ; xaddl %0, (%1) \n\t"
|
||||
: "=r" (r)
|
||||
: "r" (lpAddend), "0" (-1)
|
||||
: "memory"
|
||||
);
|
||||
return (LONG) (r - 1); */// subtract, since we get the original value back.
|
||||
return __sync_fetch_and_sub(lpAddend, 1) - 1;
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
DLL_EXPORT LONG CryInterlockedExchangeAdd(LONG volatile* lpAddend, LONG Value)
|
||||
{
|
||||
/* LONG r;
|
||||
__asm__ __volatile__ (
|
||||
#if defined(LINUX64) || defined(APPLE) // long is 64 bits on amd64.
|
||||
"lock ; xaddq %0, (%1) \n\t"
|
||||
#else
|
||||
"lock ; xaddl %0, (%1) \n\t"
|
||||
#endif
|
||||
: "=r" (r)
|
||||
: "r" (lpAddend), "0" (Value)
|
||||
: "memory"
|
||||
);
|
||||
return r;*/
|
||||
return __sync_fetch_and_add(lpAddend, Value);
|
||||
}
|
||||
|
||||
DLL_EXPORT LONG CryInterlockedOr(LONG volatile* Destination, LONG Value)
|
||||
{
|
||||
return __sync_fetch_and_or(Destination, Value);
|
||||
}
|
||||
|
||||
DLL_EXPORT LONG CryInterlockedCompareExchange(LONG volatile* dst, LONG exchange, LONG comperand)
|
||||
{
|
||||
return __sync_val_compare_and_swap(dst, comperand, exchange);
|
||||
/*LONG r;
|
||||
__asm__ __volatile__ (
|
||||
#if defined(LINUX64) || defined(APPLE) // long is 64 bits on amd64.
|
||||
"lock ; cmpxchgq %2, (%1) \n\t"
|
||||
#else
|
||||
"lock ; cmpxchgl %2, (%1) \n\t"
|
||||
#endif
|
||||
: "=a" (r)
|
||||
: "r" (dst), "r" (exchange), "0" (comperand)
|
||||
: "memory"
|
||||
);
|
||||
return r;*/
|
||||
}
|
||||
|
||||
|
||||
DLL_EXPORT void* CryInterlockedCompareExchangePointer(void* volatile* dst, void* exchange, void* comperand)
|
||||
{
|
||||
return __sync_val_compare_and_swap(dst, comperand, exchange);
|
||||
//return (void*)CryInterlockedCompareExchange((long volatile*)dst, (long)exchange, (long)comperand);
|
||||
}
|
||||
|
||||
DLL_EXPORT void* CryInterlockedExchangePointer(void* volatile* dst, void* exchange)
|
||||
{
|
||||
__sync_synchronize();
|
||||
return __sync_lock_test_and_set(dst, exchange);
|
||||
//return (void*)CryInterlockedCompareExchange((long volatile*)dst, (long)exchange, (long)comperand);
|
||||
}
|
||||
#if defined(LINUX) || defined(APPLE)
|
||||
|
||||
threadID CryGetCurrentThreadId()
|
||||
{
|
||||
|
||||
@@ -86,8 +86,6 @@ set(FILES
|
||||
CryPodArray.h
|
||||
CrySizer.h
|
||||
CrySystemBus.h
|
||||
CryThread.h
|
||||
CryThreadImpl.h
|
||||
CryTypeInfo.h
|
||||
CryVersion.h
|
||||
FrameProfiler.h
|
||||
@@ -95,7 +93,6 @@ set(FILES
|
||||
LegacyAllocator.h
|
||||
MetaUtils.h
|
||||
MiniQueue.h
|
||||
MultiThread.h
|
||||
MultiThread_Containers.h
|
||||
NullAudioSystem.h
|
||||
PNoise3.h
|
||||
@@ -152,11 +149,6 @@ set(FILES
|
||||
CryAssert_Mac.h
|
||||
CryLibrary.cpp
|
||||
CryLibrary.h
|
||||
CryThread_dummy.h
|
||||
CryThread_pthreads.h
|
||||
CryThread_windows.h
|
||||
CryThreadImpl_pthreads.h
|
||||
CryThreadImpl_windows.h
|
||||
Linux32Specific.h
|
||||
Linux64Specific.h
|
||||
Linux_Win32Wrapper.h
|
||||
|
||||
@@ -26,6 +26,8 @@
|
||||
|
||||
#include <ISystem.h>
|
||||
|
||||
#include <AzCore/std/parallel/spin_mutex.h>
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// Physics defines.
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
@@ -2834,8 +2836,8 @@ struct IGeometry
|
||||
virtual int PointInsideStatus(const Vec3& pt) = 0; // for meshes, will create an auxiliary hashgrid for acceleration
|
||||
// IntersectLocked - the main function for geomtries. pdata1,pdata2,pparams can be 0 - defaults will be assumed.
|
||||
// returns a pointer to an internal thread-specific contact buffer, locked with the lock argument
|
||||
virtual int IntersectLocked(IGeometry* pCollider, geom_world_data* pdata1, geom_world_data* pdata2, intersection_params* pparams, geom_contact*& pcontacts, WriteLockCond& lock) = 0;
|
||||
virtual int IntersectLocked(IGeometry* pCollider, geom_world_data* pdata1, geom_world_data* pdata2, intersection_params* pparams, geom_contact*& pcontacts, WriteLockCond& lock, int iCaller) = 0;
|
||||
virtual int IntersectLocked(IGeometry* pCollider, geom_world_data* pdata1, geom_world_data* pdata2, intersection_params* pparams, geom_contact*& pcontacts, AZStd::spin_mutex& lock) = 0;
|
||||
virtual int IntersectLocked(IGeometry* pCollider, geom_world_data* pdata1, geom_world_data* pdata2, intersection_params* pparams, geom_contact*& pcontacts, AZStd::spin_mutex& lock, int iCaller) = 0;
|
||||
// Intersect - same as Intersect, but doesn't lock pcontacts
|
||||
virtual int Intersect(IGeometry* pCollider, geom_world_data* pdata1, geom_world_data* pdata2, intersection_params* pparams, geom_contact*& pcontacts) = 0;
|
||||
// FindClosestPoint - for non-convex meshes only does local search, doesn't guarantee global minimum
|
||||
|
||||
@@ -135,7 +135,6 @@
|
||||
#define PRINTF_EMPTY_FORMAT ""
|
||||
#endif
|
||||
|
||||
|
||||
//default stack size for threads, currently only used on pthread platforms
|
||||
#if defined(AZ_RESTRICTED_PLATFORM)
|
||||
#define AZ_RESTRICTED_SECTION PLATFORM_H_SECTION_8
|
||||
@@ -143,14 +142,6 @@
|
||||
#endif
|
||||
#if defined(AZ_RESTRICTED_SECTION_IMPLEMENTED)
|
||||
#undef AZ_RESTRICTED_SECTION_IMPLEMENTED
|
||||
#elif defined(LINUX) || defined(APPLE)
|
||||
#if !defined(_DEBUG)
|
||||
#define SIMPLE_THREAD_STACK_SIZE_KB (256)
|
||||
#else
|
||||
#define SIMPLE_THREAD_STACK_SIZE_KB (256 * 4)
|
||||
#endif
|
||||
#else
|
||||
#define SIMPLE_THREAD_STACK_SIZE_KB (32)
|
||||
#endif
|
||||
|
||||
#include <AzCore/PlatformDef.h>
|
||||
@@ -199,7 +190,7 @@
|
||||
#elif defined(ANDROID)
|
||||
#include "AndroidSpecific.h"
|
||||
#elif defined(IOS)
|
||||
#include "iOSSpecific.h"
|
||||
#include "iOSSpecific.h"
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
@@ -38,10 +38,6 @@ struct SSystemGlobalEnvironment* gEnv = nullptr;
|
||||
#include AZ_RESTRICTED_FILE(platform_impl_h)
|
||||
#endif
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// If not in static library.
|
||||
#include <CryThreadImpl.h>
|
||||
|
||||
#if defined(WIN32) || defined(WIN64)
|
||||
void CryPureCallHandler()
|
||||
{
|
||||
@@ -278,111 +274,6 @@ void InitRootDir(char szExeFileName[], uint nExeSize, char szExeRootName[], uint
|
||||
}
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
LONG CryInterlockedIncrement(int volatile* lpAddend)
|
||||
{
|
||||
return InterlockedIncrement((volatile LONG*)lpAddend);
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
LONG CryInterlockedDecrement(int volatile* lpAddend)
|
||||
{
|
||||
return InterlockedDecrement((volatile LONG*)lpAddend);
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
LONG CryInterlockedExchangeAdd(LONG volatile* lpAddend, LONG Value)
|
||||
{
|
||||
return InterlockedExchangeAdd(lpAddend, Value);
|
||||
}
|
||||
|
||||
LONG CryInterlockedOr(LONG volatile* Destination, LONG Value)
|
||||
{
|
||||
return InterlockedOr(Destination, Value);
|
||||
}
|
||||
|
||||
LONG CryInterlockedCompareExchange(LONG volatile* dst, LONG exchange, LONG comperand)
|
||||
{
|
||||
return InterlockedCompareExchange(dst, exchange, comperand);
|
||||
}
|
||||
|
||||
void* CryInterlockedCompareExchangePointer(void* volatile* dst, void* exchange, void* comperand)
|
||||
{
|
||||
return InterlockedCompareExchangePointer(dst, exchange, comperand);
|
||||
}
|
||||
|
||||
void* CryInterlockedExchangePointer(void* volatile* dst, void* exchange)
|
||||
{
|
||||
return InterlockedExchangePointer(dst, exchange);
|
||||
}
|
||||
|
||||
void CryInterlockedAdd(volatile size_t* pVal, ptrdiff_t iAdd)
|
||||
{
|
||||
#if defined (PLATFORM_64BIT)
|
||||
#if !defined(NDEBUG)
|
||||
size_t v = (size_t)
|
||||
#endif
|
||||
InterlockedAdd64((volatile int64*)pVal, iAdd);
|
||||
#else
|
||||
size_t v = (size_t)CryInterlockedExchangeAdd((volatile long*)pVal, (long)iAdd);
|
||||
v += iAdd;
|
||||
#endif
|
||||
assert((iAdd == 0) || (iAdd < 0 && v < v - (size_t)iAdd) || (iAdd > 0 && v > v - (size_t)iAdd));
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
void* CryCreateCriticalSection()
|
||||
{
|
||||
CRITICAL_SECTION* pCS = new CRITICAL_SECTION;
|
||||
InitializeCriticalSection(pCS);
|
||||
return pCS;
|
||||
}
|
||||
|
||||
void CryCreateCriticalSectionInplace(void* pCS)
|
||||
{
|
||||
InitializeCriticalSection((CRITICAL_SECTION*)pCS);
|
||||
}
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
void CryDeleteCriticalSection(void* cs)
|
||||
{
|
||||
CRITICAL_SECTION* pCS = (CRITICAL_SECTION*)cs;
|
||||
if (pCS->LockCount >= 0)
|
||||
{
|
||||
CryFatalError("Critical Section hanging lock");
|
||||
}
|
||||
DeleteCriticalSection(pCS);
|
||||
delete pCS;
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
void CryDeleteCriticalSectionInplace(void* cs)
|
||||
{
|
||||
CRITICAL_SECTION* pCS = (CRITICAL_SECTION*)cs;
|
||||
if (pCS->LockCount >= 0)
|
||||
{
|
||||
CryFatalError("Critical Section hanging lock");
|
||||
}
|
||||
DeleteCriticalSection(pCS);
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
void CryEnterCriticalSection(void* cs)
|
||||
{
|
||||
EnterCriticalSection((CRITICAL_SECTION*)cs);
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
bool CryTryCriticalSection(void* cs)
|
||||
{
|
||||
return TryEnterCriticalSection((CRITICAL_SECTION*)cs) != 0;
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
void CryLeaveCriticalSection(void* cs)
|
||||
{
|
||||
LeaveCriticalSection((CRITICAL_SECTION*)cs);
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
bool CrySetFileAttributes(const char* lpFileName, uint32 dwFileAttributes)
|
||||
{
|
||||
|
||||
@@ -13,12 +13,14 @@
|
||||
|
||||
#include <platform.h>
|
||||
#include <type_traits>
|
||||
#include <MultiThread.h>
|
||||
|
||||
void CryFatalError(const char*, ...) PRINTF_PARAMS(1, 2);
|
||||
#if defined(APPLE)
|
||||
#include <cstddef>
|
||||
#endif
|
||||
|
||||
#include <AzCore/std/parallel/atomic.h>
|
||||
|
||||
//////////////////////////////////////////////////////////////////
|
||||
// SMART POINTER
|
||||
//////////////////////////////////////////////////////////////////
|
||||
@@ -353,38 +355,32 @@ protected:
|
||||
class CMultiThreadRefCount
|
||||
{
|
||||
public:
|
||||
CMultiThreadRefCount()
|
||||
: m_cnt(0) {}
|
||||
CMultiThreadRefCount() {}
|
||||
virtual ~CMultiThreadRefCount() {}
|
||||
|
||||
inline int AddRef()
|
||||
{
|
||||
return CryInterlockedIncrement(&m_cnt);
|
||||
return m_count.fetch_add(1, AZStd::memory_order_acq_rel) + 1; // because we get the original value back
|
||||
}
|
||||
inline int Release()
|
||||
{
|
||||
const int nCount = CryInterlockedDecrement(&m_cnt);
|
||||
assert(nCount >= 0);
|
||||
const int nCount = m_count.fetch_sub(1, AZStd::memory_order_acq_rel) - 1; // because we get the original value back
|
||||
AZ_Assert(nCount >= 0, "Deleting Reference Counted Object Twice");
|
||||
if (nCount == 0)
|
||||
{
|
||||
delete this;
|
||||
}
|
||||
else if (nCount < 0)
|
||||
{
|
||||
assert(0);
|
||||
CryFatalError("Deleting Reference Counted Object Twice");
|
||||
}
|
||||
return nCount;
|
||||
}
|
||||
|
||||
inline int GetRefCount() const { return m_cnt; }
|
||||
inline int GetRefCount() const { return m_count.load(AZStd::memory_order_acquire); }
|
||||
|
||||
protected:
|
||||
// Allows the memory for the object to be deallocated in the dynamic module where it was originally constructed, as it may use different memory manager (Debug/Release configurations)
|
||||
virtual void DeleteThis() { delete this; }
|
||||
|
||||
private:
|
||||
volatile int m_cnt;
|
||||
AZStd::atomic_int m_count{ 0 };
|
||||
};
|
||||
|
||||
// base class for interfaces implementing reference counting that needs to be thread-safe
|
||||
@@ -405,29 +401,24 @@ public:
|
||||
|
||||
virtual void AddRef()
|
||||
{
|
||||
CryInterlockedIncrement(&m_nRefCounter);
|
||||
m_nRefCounter.fetch_add(1, AZStd::memory_order_acq_rel);
|
||||
}
|
||||
|
||||
virtual void Release()
|
||||
{
|
||||
const int nCount = CryInterlockedDecrement(&m_nRefCounter);
|
||||
assert(nCount >= 0);
|
||||
const int nCount = m_nRefCounter.fetch_sub(1, AZStd::memory_order_acq_rel) - 1; // because we get the original value back
|
||||
AZ_Assert(nCount >= 0, "Deleting Reference Counted Object Twice");
|
||||
if (nCount == 0)
|
||||
{
|
||||
delete this;
|
||||
}
|
||||
else if (nCount < 0)
|
||||
{
|
||||
assert(0);
|
||||
CryFatalError("Deleting Reference Counted Object Twice");
|
||||
}
|
||||
}
|
||||
|
||||
Counter NumRefs() const { return m_nRefCounter; }
|
||||
Counter NumRefs() const { return m_nRefCounter.load(AZStd::memory_order_acquire); }
|
||||
|
||||
protected:
|
||||
|
||||
volatile Counter m_nRefCounter;
|
||||
AZStd::atomic<Counter> m_nRefCounter{ 0 };
|
||||
};
|
||||
|
||||
typedef _i_reference_target<int> _i_reference_target_t;
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
|
||||
#include <AzCore/Debug/StackTracer.h>
|
||||
#include <AzCore/Debug/EventTraceDrillerBus.h>
|
||||
#include <AzCore/std/parallel/spin_mutex.h>
|
||||
#include <AzCore/Utils/Utils.h>
|
||||
|
||||
#define VS_VERSION_INFO 1
|
||||
@@ -153,13 +154,13 @@ void DebugCallStack::SetUserDialogEnable(const bool bUserDialogEnable)
|
||||
DWORD g_idDebugThreads[10];
|
||||
const char* g_nameDebugThreads[10];
|
||||
int g_nDebugThreads = 0;
|
||||
volatile int g_lockThreadDumpList = 0;
|
||||
AZStd::spin_mutex g_lockThreadDumpList;
|
||||
|
||||
void MarkThisThreadForDebugging(const char* name)
|
||||
{
|
||||
EBUS_EVENT(AZ::Debug::EventTraceDrillerSetupBus, SetThreadName, AZStd::this_thread::get_id(), name);
|
||||
|
||||
WriteLock lock(g_lockThreadDumpList);
|
||||
AZStd::scoped_lock lock(g_lockThreadDumpList);
|
||||
DWORD id = GetCurrentThreadId();
|
||||
if (g_nDebugThreads == sizeof(g_idDebugThreads) / sizeof(g_idDebugThreads[0]))
|
||||
{
|
||||
@@ -179,7 +180,7 @@ void MarkThisThreadForDebugging(const char* name)
|
||||
|
||||
void UnmarkThisThreadFromDebugging()
|
||||
{
|
||||
WriteLock lock(g_lockThreadDumpList);
|
||||
AZStd::scoped_lock lock(g_lockThreadDumpList);
|
||||
DWORD id = GetCurrentThreadId();
|
||||
for (int i = g_nDebugThreads - 1; i >= 0; i--)
|
||||
{
|
||||
|
||||
@@ -309,8 +309,8 @@ private:
|
||||
TLocalizationBitfield m_availableLocalizations;
|
||||
|
||||
//Lock for
|
||||
mutable CryCriticalSection m_cs;
|
||||
typedef CryAutoCriticalSection AutoLock;
|
||||
mutable AZStd::mutex m_cs;
|
||||
typedef AZStd::lock_guard<AZStd::mutex> AutoLock;
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -31,17 +31,6 @@
|
||||
#include <syslog.h>
|
||||
#endif
|
||||
|
||||
|
||||
// Only accept logging from the main thread.
|
||||
#ifdef WIN32
|
||||
|
||||
#define THREAD_SAFE_LOG
|
||||
//#define THREAD_SAFE_LOG CryAutoCriticalSection scope_lock(m_logCriticalSection);
|
||||
|
||||
#else
|
||||
#define THREAD_SAFE_LOG
|
||||
#endif //WIN32
|
||||
|
||||
#define LOG_BACKUP_PATH "@log@/LogBackups"
|
||||
|
||||
#if defined(IOS)
|
||||
@@ -821,13 +810,13 @@ void CLog::PushAssetScopeName(const char* sAssetType, const char* sName)
|
||||
SAssetScopeInfo as;
|
||||
as.sType = sAssetType;
|
||||
as.sName = sName;
|
||||
CryAutoCriticalSection scope_lock(m_assetScopeQueueLock);
|
||||
AZStd::scoped_lock scope_lock(m_assetScopeQueueLock);
|
||||
m_assetScopeQueue.push_back(as);
|
||||
}
|
||||
|
||||
void CLog::PopAssetScopeName()
|
||||
{
|
||||
CryAutoCriticalSection scope_lock(m_assetScopeQueueLock);
|
||||
AZStd::scoped_lock scope_lock(m_assetScopeQueueLock);
|
||||
assert(!m_assetScopeQueue.empty());
|
||||
if (!m_assetScopeQueue.empty())
|
||||
{
|
||||
@@ -838,7 +827,7 @@ void CLog::PopAssetScopeName()
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
const char* CLog::GetAssetScopeString()
|
||||
{
|
||||
CryAutoCriticalSection scope_lock(m_assetScopeQueueLock);
|
||||
AZStd::scoped_lock scope_lock(m_assetScopeQueueLock);
|
||||
|
||||
m_assetScopeString.clear();
|
||||
for (size_t i = 0; i < m_assetScopeQueue.size(); i++)
|
||||
@@ -1461,7 +1450,7 @@ void CLog::Update()
|
||||
{
|
||||
if (!m_threadSafeMsgQueue.empty())
|
||||
{
|
||||
CryAutoCriticalSection lock(m_threadSafeMsgQueue.get_lock()); // Get the lock and hold onto it until we clear the entire queue (prevents other threads adding more things in while we clear it)
|
||||
AZStd::scoped_lock lock(m_threadSafeMsgQueue.get_lock()); // Get the lock and hold onto it until we clear the entire queue (prevents other threads adding more things in while we clear it)
|
||||
// Must be called from main thread
|
||||
SLogMsg msg;
|
||||
while (m_threadSafeMsgQueue.try_pop(msg))
|
||||
|
||||
@@ -10,8 +10,6 @@
|
||||
#pragma once
|
||||
|
||||
#include <ILog.h>
|
||||
#include <CryThread.h>
|
||||
#include <MultiThread.h>
|
||||
#include <MultiThread_Containers.h>
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
@@ -168,7 +166,7 @@ private: // -------------------------------------------------------------------
|
||||
};
|
||||
|
||||
std::vector<SAssetScopeInfo> m_assetScopeQueue;
|
||||
CryCriticalSection m_assetScopeQueueLock;
|
||||
AZStd::mutex m_assetScopeQueueLock;
|
||||
string m_assetScopeString;
|
||||
#endif
|
||||
|
||||
@@ -176,8 +174,6 @@ private: // -------------------------------------------------------------------
|
||||
|
||||
IConsole* m_pConsole; //
|
||||
|
||||
CryCriticalSection m_logCriticalSection;
|
||||
|
||||
struct SLogHistoryItem
|
||||
{
|
||||
char str[MAX_WARNING_LENGTH];
|
||||
|
||||
@@ -17,17 +17,17 @@ CSystemEventDispatcher::CSystemEventDispatcher()
|
||||
|
||||
bool CSystemEventDispatcher::RegisterListener(ISystemEventListener* pListener)
|
||||
{
|
||||
m_listenerRegistrationLock.Lock();
|
||||
m_listenerRegistrationLock.lock();
|
||||
bool ret = m_listeners.Add(pListener);
|
||||
m_listenerRegistrationLock.Unlock();
|
||||
m_listenerRegistrationLock.unlock();
|
||||
return ret;
|
||||
}
|
||||
|
||||
bool CSystemEventDispatcher::RemoveListener(ISystemEventListener* pListener)
|
||||
{
|
||||
m_listenerRegistrationLock.Lock();
|
||||
m_listenerRegistrationLock.lock();
|
||||
m_listeners.Remove(pListener);
|
||||
m_listenerRegistrationLock.Unlock();
|
||||
m_listenerRegistrationLock.unlock();
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -35,12 +35,12 @@ bool CSystemEventDispatcher::RemoveListener(ISystemEventListener* pListener)
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
void CSystemEventDispatcher::OnSystemEventAnyThread(ESystemEvent event, UINT_PTR wparam, UINT_PTR lparam)
|
||||
{
|
||||
m_listenerRegistrationLock.Lock();
|
||||
m_listenerRegistrationLock.lock();
|
||||
for (TSystemEventListeners::Notifier notifier(m_listeners); notifier.IsValid(); notifier.Next())
|
||||
{
|
||||
notifier->OnSystemEventAnyThread(event, wparam, lparam);
|
||||
}
|
||||
m_listenerRegistrationLock.Unlock();
|
||||
m_listenerRegistrationLock.unlock();
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
|
||||
#include <ISystem.h>
|
||||
#include <CryListenerSet.h>
|
||||
#include <MultiThread_Containers.h>
|
||||
|
||||
class CSystemEventDispatcher
|
||||
: public ISystemEventDispatcher
|
||||
@@ -46,7 +47,7 @@ private:
|
||||
|
||||
typedef CryMT::queue<SEventParams> TSystemEventQueue;
|
||||
TSystemEventQueue m_systemEventQueue;
|
||||
CryCriticalSection m_listenerRegistrationLock;
|
||||
AZStd::recursive_mutex m_listenerRegistrationLock;
|
||||
};
|
||||
|
||||
#endif // CRYINCLUDE_CRYSYSTEM_SYSTEMEVENTDISPATCHER_H
|
||||
|
||||
@@ -93,40 +93,62 @@ bool RCON_IsRemoteAllowedToConnect(const AZ::AzSock::AzSocketAddress& connectee)
|
||||
/////////////////////////////////////////////////////////////////////////////////////////////
|
||||
/////////////////////////////////////////////////////////////////////////////////////////////
|
||||
/////////////////////////////////////////////////////////////////////////////////////////////
|
||||
void SRemoteThreadedObject::Start(const char* name)
|
||||
{
|
||||
AZStd::thread_desc desc;
|
||||
desc.m_name = name;
|
||||
|
||||
auto function = AZStd::bind(&SRemoteThreadedObject::ThreadFunction, this);
|
||||
m_thread = AZStd::thread(function, &desc);
|
||||
}
|
||||
|
||||
void SRemoteThreadedObject::WaitForThread()
|
||||
{
|
||||
if (m_thread.joinable())
|
||||
{
|
||||
m_thread.join();
|
||||
}
|
||||
}
|
||||
|
||||
void SRemoteThreadedObject::ThreadFunction()
|
||||
{
|
||||
Run();
|
||||
Terminate();
|
||||
}
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////////////////////
|
||||
/////////////////////////////////////////////////////////////////////////////////////////////
|
||||
/////////////////////////////////////////////////////////////////////////////////////////////
|
||||
void SRemoteServer::StartServer()
|
||||
{
|
||||
StopServer();
|
||||
m_bAcceptClients = true;
|
||||
Start(0, kServerThreadName);
|
||||
Start(kServerThreadName);
|
||||
}
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////////////////////
|
||||
void SRemoteServer::StopServer()
|
||||
{
|
||||
Stop();
|
||||
m_bAcceptClients = false;
|
||||
AZ::AzSock::CloseSocket(m_socket);
|
||||
m_socket = SOCKET_ERROR;
|
||||
m_lock.Lock();
|
||||
|
||||
AZStd::unique_lock<AZStd::recursive_mutex> lock(m_mutex);
|
||||
for (TClients::iterator it = m_clients.begin(); it != m_clients.end(); ++it)
|
||||
{
|
||||
it->pClient->StopClient();
|
||||
}
|
||||
m_lock.Unlock();
|
||||
m_stopEvent.Wait();
|
||||
m_stopEvent.Set();
|
||||
m_stopCondition.wait(lock, [this] { return m_clients.empty(); });
|
||||
}
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////////////////////
|
||||
void SRemoteServer::ClientDone(SRemoteClient* pClient)
|
||||
{
|
||||
m_lock.Lock();
|
||||
AZStd::scoped_lock lock(m_mutex);
|
||||
for (TClients::iterator it = m_clients.begin(); it != m_clients.end(); ++it)
|
||||
{
|
||||
if (it->pClient == pClient)
|
||||
{
|
||||
it->pClient->Stop();
|
||||
delete it->pClient;
|
||||
delete it->pEvents;
|
||||
m_clients.erase(it);
|
||||
@@ -136,9 +158,8 @@ void SRemoteServer::ClientDone(SRemoteClient* pClient)
|
||||
|
||||
if (m_clients.empty())
|
||||
{
|
||||
m_stopEvent.Set();
|
||||
m_stopCondition.notify_all();
|
||||
}
|
||||
m_lock.Unlock();
|
||||
}
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////////////////////
|
||||
@@ -149,7 +170,6 @@ void SRemoteServer::Terminate()
|
||||
/////////////////////////////////////////////////////////////////////////////////////////////
|
||||
void SRemoteServer::Run()
|
||||
{
|
||||
SetName(kServerThreadName);
|
||||
AZ_TRAIT_REMOTECONSOLE_SET_THREAD_AFFINITY
|
||||
|
||||
AZSOCKET sClient;
|
||||
@@ -232,12 +252,10 @@ void SRemoteServer::Run()
|
||||
continue;
|
||||
}
|
||||
|
||||
m_lock.Lock();
|
||||
m_stopEvent.Reset();
|
||||
AZStd::scoped_lock lock(m_mutex);
|
||||
SRemoteClient* pClient = new SRemoteClient(this);
|
||||
m_clients.push_back(SRemoteClientInfo(pClient));
|
||||
pClient->StartClient(sClient);
|
||||
m_lock.Unlock();
|
||||
}
|
||||
AZ::AzSock::CloseSocket(m_socket);
|
||||
CryLog("Remote console terminating.\n");
|
||||
@@ -247,43 +265,42 @@ void SRemoteServer::Run()
|
||||
/////////////////////////////////////////////////////////////////////////////////////////////
|
||||
void SRemoteServer::AddEvent(IRemoteEvent* pEvent)
|
||||
{
|
||||
m_lock.Lock();
|
||||
AZStd::scoped_lock lock(m_mutex);
|
||||
for (TClients::iterator it = m_clients.begin(); it != m_clients.end(); ++it)
|
||||
{
|
||||
it->pEvents->push_back(pEvent->Clone());
|
||||
}
|
||||
m_lock.Unlock();
|
||||
delete pEvent;
|
||||
}
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////////////////////
|
||||
void SRemoteServer::GetEvents(TEventBuffer& buffer)
|
||||
{
|
||||
m_lock.Lock();
|
||||
AZStd::scoped_lock lock(m_mutex);
|
||||
buffer = m_eventBuffer;
|
||||
m_eventBuffer.clear();
|
||||
m_lock.Unlock();
|
||||
}
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////////////////////
|
||||
bool SRemoteServer::WriteBuffer(SRemoteClient* pClient, char* buffer, int& size)
|
||||
{
|
||||
m_lock.Lock();
|
||||
IRemoteEvent* pEvent = nullptr;
|
||||
for (TClients::iterator it = m_clients.begin(); it != m_clients.end(); ++it)
|
||||
{
|
||||
if (it->pClient == pClient)
|
||||
AZStd::scoped_lock lock(m_mutex);
|
||||
for (TClients::iterator it = m_clients.begin(); it != m_clients.end(); ++it)
|
||||
{
|
||||
TEventBuffer* pEvents = it->pEvents;
|
||||
if (!pEvents->empty())
|
||||
if (it->pClient == pClient)
|
||||
{
|
||||
pEvent = pEvents->front();
|
||||
pEvents->pop_front();
|
||||
TEventBuffer* pEvents = it->pEvents;
|
||||
if (!pEvents->empty())
|
||||
{
|
||||
pEvent = pEvents->front();
|
||||
pEvents->pop_front();
|
||||
}
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
m_lock.Unlock();
|
||||
const bool res = (pEvent != nullptr);
|
||||
if (pEvent)
|
||||
{
|
||||
@@ -297,7 +314,7 @@ bool SRemoteServer::WriteBuffer(SRemoteClient* pClient, char* buffer, int& size
|
||||
bool SRemoteServer::ReadBuffer(const char* buffer, int data)
|
||||
{
|
||||
bool result = true;
|
||||
|
||||
|
||||
// Sometimes multiple events can come in a single buffer, so make sure we look
|
||||
// at the entire thing.
|
||||
int bytesRemaining = data;
|
||||
@@ -306,15 +323,14 @@ bool SRemoteServer::ReadBuffer(const char* buffer, int data)
|
||||
{
|
||||
// Create the event from the current sub string in the buffer.
|
||||
IRemoteEvent* event = SRemoteEventFactory::GetInst()->CreateEventFromBuffer(curBuffer, bytesRemaining);
|
||||
|
||||
|
||||
result &= (event != nullptr);
|
||||
if (event)
|
||||
{
|
||||
if (event->GetType() != eCET_Noop)
|
||||
{
|
||||
m_lock.Lock();
|
||||
AZStd::scoped_lock lock(m_mutex);
|
||||
m_eventBuffer.push_back(event);
|
||||
m_lock.Unlock();
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -337,7 +353,7 @@ bool SRemoteServer::ReadBuffer(const char* buffer, int data)
|
||||
void SRemoteClient::StartClient(AZSOCKET socket)
|
||||
{
|
||||
m_socket = socket;
|
||||
Start(0, kClientThreadName);
|
||||
Start(kClientThreadName);
|
||||
}
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////////////////////
|
||||
@@ -356,7 +372,6 @@ void SRemoteClient::Terminate()
|
||||
/////////////////////////////////////////////////////////////////////////////////////////////
|
||||
void SRemoteClient::Run()
|
||||
{
|
||||
SetName(kClientThreadName);
|
||||
AZ_TRAIT_REMOTECONSOLE_SET_THREAD_AFFINITY
|
||||
|
||||
char szBuff[kDefaultBufferSize];
|
||||
|
||||
@@ -11,9 +11,11 @@
|
||||
#include <AzCore/std/containers/map.h>
|
||||
#include <AzCore/std/containers/list.h>
|
||||
#include <AzCore/std/containers/vector.h>
|
||||
#include <AzCore/std/parallel/condition_variable.h>
|
||||
#include <AzCore/std/parallel/mutex.h>
|
||||
#include <AzCore/std/parallel/thread.h>
|
||||
#include <AzCore/std/string/string.h>
|
||||
|
||||
#include <CryThread.h>
|
||||
|
||||
extern const int defaultRemoteConsolePort;
|
||||
|
||||
@@ -146,6 +148,30 @@ private:
|
||||
|
||||
typedef AZStd::list<IRemoteEvent*> TEventBuffer;
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// SRemoteThreadedObject
|
||||
//
|
||||
// Simple runnable-like threaded object
|
||||
//
|
||||
/////////////////////////////////////////////////////////////////////////////////////////////
|
||||
struct SRemoteThreadedObject
|
||||
{
|
||||
virtual ~SRemoteThreadedObject() = default;
|
||||
|
||||
void Start(const char* name);
|
||||
|
||||
void WaitForThread();
|
||||
|
||||
virtual void Run() = 0;
|
||||
virtual void Terminate() = 0;
|
||||
|
||||
private:
|
||||
void ThreadFunction();
|
||||
|
||||
AZStd::thread m_thread;
|
||||
};
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// SRemoteServer
|
||||
//
|
||||
@@ -154,10 +180,10 @@ typedef AZStd::list<IRemoteEvent*> TEventBuffer;
|
||||
/////////////////////////////////////////////////////////////////////////////////////////////
|
||||
struct SRemoteClient;
|
||||
struct SRemoteServer
|
||||
: public CrySimpleThread<>
|
||||
: public SRemoteThreadedObject
|
||||
{
|
||||
SRemoteServer()
|
||||
: m_socket(AZ_SOCKET_INVALID) { m_stopEvent.Set(); }
|
||||
: m_socket(AZ_SOCKET_INVALID) {}
|
||||
|
||||
void StartServer();
|
||||
void StopServer();
|
||||
@@ -165,10 +191,8 @@ struct SRemoteServer
|
||||
void AddEvent(IRemoteEvent* pEvent);
|
||||
void GetEvents(TEventBuffer& buffer);
|
||||
|
||||
// CrySimpleThread
|
||||
void Terminate() override;
|
||||
void Run() override;
|
||||
// ~CrySimpleThread
|
||||
|
||||
private:
|
||||
bool WriteBuffer(SRemoteClient* pClient, char* buffer, int& size);
|
||||
@@ -189,9 +213,9 @@ private:
|
||||
typedef AZStd::vector<SRemoteClientInfo> TClients;
|
||||
TClients m_clients;
|
||||
AZSOCKET m_socket;
|
||||
CryMutex m_lock;
|
||||
AZStd::recursive_mutex m_mutex;
|
||||
TEventBuffer m_eventBuffer;
|
||||
CryEvent m_stopEvent;
|
||||
AZStd::condition_variable_any m_stopCondition;
|
||||
volatile bool m_bAcceptClients;
|
||||
friend struct SRemoteClient;
|
||||
};
|
||||
@@ -204,7 +228,7 @@ private:
|
||||
//
|
||||
/////////////////////////////////////////////////////////////////////////////////////////////
|
||||
struct SRemoteClient
|
||||
: public CrySimpleThread<>
|
||||
: public SRemoteThreadedObject
|
||||
{
|
||||
SRemoteClient(SRemoteServer* pServer)
|
||||
: m_pServer(pServer)
|
||||
@@ -213,10 +237,8 @@ struct SRemoteClient
|
||||
void StartClient(AZSOCKET socket);
|
||||
void StopClient();
|
||||
|
||||
// CrySimpleThread
|
||||
void Terminate() override;
|
||||
void Run() override;
|
||||
// ~CrySimpleThread
|
||||
|
||||
private:
|
||||
bool RecvPackage(char* buffer, int& size);
|
||||
|
||||
@@ -97,7 +97,7 @@ namespace AZ
|
||||
void UnregisterFont(const char* fontName);
|
||||
|
||||
private:
|
||||
using FontMap = std::unordered_map<AzFramework::FontId, FFont*>;
|
||||
using FontMap = AZStd::unordered_map<AzFramework::FontId, FFont*>;
|
||||
using FontMapItor = FontMap::iterator;
|
||||
using FontMapConstItor = FontMap::const_iterator;
|
||||
|
||||
|
||||
@@ -153,7 +153,7 @@ namespace Audio
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
void SAudioRequestDataInternal::Release()
|
||||
{
|
||||
const int nCount = CryInterlockedDecrement(&m_nRefCounter);
|
||||
const int nCount = m_nRefCounter.fetch_sub(1, AZStd::memory_order_acq_rel) - 1; // because we get the original value back
|
||||
AZ_Assert(nCount >= 0, "AudioRequests Release - Decremented reference counter too many times!");
|
||||
|
||||
if (nCount == 0)
|
||||
|
||||
Reference in New Issue
Block a user