Merge pull request #7353 from Robyt3/Engine-Jobpool-Refactoring

Minor refactoring of engine jobpool
This commit is contained in:
Dennis Felsing 2023-10-15 22:29:33 +00:00 committed by GitHub
commit 042a04d610
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 19 additions and 24 deletions

View file

@ -824,16 +824,14 @@ void *thread_init(void (*threadfunc)(void *), void *u, const char *name)
#if defined(CONF_PLATFORM_MACOS) && defined(__MAC_10_10) && __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_10 #if defined(CONF_PLATFORM_MACOS) && defined(__MAC_10_10) && __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_10
pthread_attr_set_qos_class_np(&attr, QOS_CLASS_USER_INTERACTIVE, 0); pthread_attr_set_qos_class_np(&attr, QOS_CLASS_USER_INTERACTIVE, 0);
#endif #endif
int result = pthread_create(&id, &attr, thread_run, data); dbg_assert(pthread_create(&id, &attr, thread_run, data) == 0, "pthread_create failure");
if(result != 0)
{
dbg_msg("thread", "creating %s thread failed: %d", name, result);
return 0;
}
return (void *)id; return (void *)id;
} }
#elif defined(CONF_FAMILY_WINDOWS) #elif defined(CONF_FAMILY_WINDOWS)
return CreateThread(NULL, 0, thread_run, data, 0, NULL); HANDLE thread = CreateThread(nullptr, 0, thread_run, data, 0, nullptr);
dbg_assert(thread != nullptr, "CreateThread failure");
// TODO: Set thread name using SetThreadDescription (would require minimum Windows 10 version 1607)
return thread;
#else #else
#error not implemented #error not implemented
#endif #endif

View file

@ -4612,7 +4612,7 @@ int main(int argc, const char **argv)
}); });
// create the components // create the components
IEngine *pEngine = CreateEngine(GAME_NAME, pFutureConsoleLogger, 2); IEngine *pEngine = CreateEngine(GAME_NAME, pFutureConsoleLogger, 2 * std::thread::hardware_concurrency() + 2);
IConsole *pConsole = CreateConsole(CFGFLAG_CLIENT).release(); IConsole *pConsole = CreateConsole(CFGFLAG_CLIENT).release();
IStorage *pStorage = CreateStorage(IStorage::STORAGETYPE_CLIENT, argc, (const char **)argv); IStorage *pStorage = CreateStorage(IStorage::STORAGETYPE_CLIENT, argc, (const char **)argv);
IConfigManager *pConfigManager = CreateConfigManager(); IConfigManager *pConfigManager = CreateConfigManager();

View file

@ -112,7 +112,7 @@ int main(int argc, const char **argv)
IKernel *pKernel = IKernel::Create(); IKernel *pKernel = IKernel::Create();
// create the components // create the components
IEngine *pEngine = CreateEngine(GAME_NAME, pFutureConsoleLogger, 2); IEngine *pEngine = CreateEngine(GAME_NAME, pFutureConsoleLogger, 2 * std::thread::hardware_concurrency() + 2);
IEngineMap *pEngineMap = CreateEngineMap(); IEngineMap *pEngineMap = CreateEngineMap();
IGameServer *pGameServer = CreateGameServer(); IGameServer *pGameServer = CreateGameServer();
IConsole *pConsole = CreateConsole(CFGFLAG_SERVER | CFGFLAG_ECON).release(); IConsole *pConsole = CreateConsole(CFGFLAG_SERVER | CFGFLAG_ECON).release();

View file

@ -19,7 +19,6 @@ int IJob::Status()
CJobPool::CJobPool() CJobPool::CJobPool()
{ {
// empty the pool // empty the pool
m_NumThreads = 0;
m_Shutdown = false; m_Shutdown = false;
m_Lock = lock_create(); m_Lock = lock_create();
sphore_init(&m_Semaphore); sphore_init(&m_Semaphore);
@ -69,21 +68,23 @@ void CJobPool::WorkerThread(void *pUser)
void CJobPool::Init(int NumThreads) void CJobPool::Init(int NumThreads)
{ {
// start threads // start threads
m_NumThreads = NumThreads > MAX_THREADS ? MAX_THREADS : NumThreads; char aName[32];
m_vpThreads.reserve(NumThreads);
for(int i = 0; i < NumThreads; i++) for(int i = 0; i < NumThreads; i++)
m_apThreads[i] = thread_init(WorkerThread, this, "CJobPool worker"); {
str_format(aName, sizeof(aName), "CJobPool worker %d", i);
m_vpThreads.push_back(thread_init(WorkerThread, this, aName));
}
} }
void CJobPool::Destroy() void CJobPool::Destroy()
{ {
m_Shutdown = true; m_Shutdown = true;
for(int i = 0; i < m_NumThreads; i++) for(size_t i = 0; i < m_vpThreads.size(); i++)
sphore_signal(&m_Semaphore); sphore_signal(&m_Semaphore);
for(int i = 0; i < m_NumThreads; i++) for(void *pThread : m_vpThreads)
{ thread_wait(pThread);
if(m_apThreads[i]) m_vpThreads.clear();
thread_wait(m_apThreads[i]);
}
lock_destroy(m_Lock); lock_destroy(m_Lock);
sphore_destroy(&m_Semaphore); sphore_destroy(&m_Semaphore);
} }

View file

@ -7,6 +7,7 @@
#include <atomic> #include <atomic>
#include <memory> #include <memory>
#include <vector>
class CJobPool; class CJobPool;
@ -37,12 +38,7 @@ public:
class CJobPool class CJobPool
{ {
enum std::vector<void *> m_vpThreads;
{
MAX_THREADS = 32
};
int m_NumThreads;
void *m_apThreads[MAX_THREADS];
std::atomic<bool> m_Shutdown; std::atomic<bool> m_Shutdown;
LOCK m_Lock; LOCK m_Lock;