Files
2026-08-08 19:30:03 -07:00

101 lines
2.4 KiB
C++

#pragma once
#include "../text/str.h"
#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif
#include <Windows.h>
#include <cstdint>
enum xthreadPriority : int {
THREAD_LOWEST = 0,
THREAD_BELOW_NORMAL = 1,
THREAD_NORMAL = 2,
THREAD_ABOVE_NORMAL = 3,
THREAD_HIGHEST = 4
};
enum core_t : int {
CORE_ANY = -1,
CORE_0A = 0,
CORE_0B = 1,
CORE_1A = 2,
CORE_1B = 3,
CORE_2A = 4,
CORE_2B = 5
};
class idSysMutex {
public:
void* handle;
idSysMutex();
~idSysMutex();
bool Lock(bool blocking = true);
void Unlock();
idSysMutex(const idSysMutex&) = delete;
idSysMutex& operator=(const idSysMutex&) = delete;
};
class idSysSignal {
public:
void* handle;
explicit idSysSignal(bool manualReset = false);
~idSysSignal();
void Raise();
void Clear();
bool Wait(int timeoutMilliseconds = -1) const;
idSysSignal(const idSysSignal&) = delete;
idSysSignal& operator=(const idSysSignal&) = delete;
};
class idSysThread {
public:
idSysThread();
virtual ~idSysThread();
virtual int Run();
bool StartThread(const char* threadName, core_t core = CORE_ANY,
xthreadPriority priority = THREAD_NORMAL, int stackSize = 0x20000);
bool StartWorkerThread(const char* threadName, core_t core = CORE_ANY,
xthreadPriority priority = THREAD_NORMAL, int stackSize = 0x20000);
void StopThread(bool wait = true);
void WaitForThread();
void SignalWork();
bool IsRunning() const { return isRunning; }
bool IsTerminating() const { return isTerminating; }
const char* GetName() const { return name.c_str(); }
idStr name;
unsigned int threadHandle;
bool isWorker;
bool isRunning;
volatile bool isTerminating;
volatile bool moreWorkToDo;
idSysSignal signalWorkerDone;
idSysSignal signalMoreWorkToDo;
idSysMutex signalMutex;
private:
static DWORD WINAPI ThreadProc(void* parameter);
};
struct ssThreadInfo_t {
int spawnId;
int objectId;
const char* name;
};
#if INTPTR_MAX == INT32_MAX
static_assert(sizeof(idSysMutex) == 4, "Recovered idSysMutex ABI changed");
static_assert(sizeof(idSysSignal) == 4, "Recovered idSysSignal ABI changed");
static_assert(sizeof(idSysThread) == 56, "Recovered idSysThread ABI changed");
static_assert(sizeof(ssThreadInfo_t) == 12, "Recovered ssThreadInfo_t ABI changed");
#endif