From 968bb5d3b7d62b3e88c49dfad494721123eb3c4b Mon Sep 17 00:00:00 2001 From: fallenoak Date: Thu, 29 Dec 2022 14:46:59 -0600 Subject: [PATCH] feat(thread): implement SCreateThread for windows --- storm/thread/S_Thread.hpp | 13 +++++++- storm/thread/win/S_Thread.cpp | 6 ++++ storm/thread/win/Thread.cpp | 63 ++++++++++++++++++++++++++++++++++- 3 files changed, 80 insertions(+), 2 deletions(-) create mode 100644 storm/thread/win/S_Thread.cpp diff --git a/storm/thread/S_Thread.hpp b/storm/thread/S_Thread.hpp index 8b2b699..ac05d14 100644 --- a/storm/thread/S_Thread.hpp +++ b/storm/thread/S_Thread.hpp @@ -3,6 +3,9 @@ #include "storm/thread/SThread.hpp" #include +#if defined(WHOA_SYSTEM_WIN) +#include +#endif typedef SThread SyncObjectData; @@ -10,7 +13,12 @@ struct SThreadParmBlock { uint32_t (*threadProc)(void*); void* threadParam; uint32_t threadID; +#if defined(WHOA_SYSTEM_WIN) + HANDLE threadH; +#endif +#if defined(WHOA_SYSTEM_MAC) || defined(WHOA_SYSTEM_LINUX) SyncObjectData* syncObject; +#endif }; class S_Thread { @@ -20,6 +28,9 @@ class S_Thread { int32_t suspended; int32_t live; uint32_t threadId; +#if defined(WHOA_SYSTEM_WIN) + HANDLE threadH; +#endif char name[16]; }; @@ -31,7 +42,7 @@ class S_Thread { // Static functions #if defined(WHOA_SYSTEM_WIN) - static uint32_t s_SLaunchThread(void* threadParam); + static DWORD s_SLaunchThread(void* threadParam); #endif #if defined(WHOA_SYSTEM_MAC) diff --git a/storm/thread/win/S_Thread.cpp b/storm/thread/win/S_Thread.cpp new file mode 100644 index 0000000..9313b89 --- /dev/null +++ b/storm/thread/win/S_Thread.cpp @@ -0,0 +1,6 @@ +#include "storm/thread/S_Thread.hpp" + +DWORD S_Thread::s_SLaunchThread(void* threadParam) { + // TODO + return 0; +} diff --git a/storm/thread/win/Thread.cpp b/storm/thread/win/Thread.cpp index 01bdda9..62240e5 100644 --- a/storm/thread/win/Thread.cpp +++ b/storm/thread/win/Thread.cpp @@ -1,6 +1,67 @@ #include "storm/Thread.hpp" +#include "storm/Memory.hpp" +#include "storm/String.hpp" +#include "storm/thread/S_Thread.hpp" +#include +#include void* SCreateThread(uint32_t (*threadProc)(void*), void* threadParam, void* a3, SThread* syncObject, const char* threadName) { + if (!threadName) { + threadName = ""; + } + // TODO - return reinterpret_cast(1); + // S_Thread::s_threadCrit.Enter(); + + if (!S_Thread::s_numthreads) { + auto& mainThread = S_Thread::s_threads[0]; + mainThread.suspended = 0; + mainThread.live = 1; + mainThread.threadId = GetCurrentThreadId(); + mainThread.threadH = nullptr; + SStrCopy(mainThread.name, "main", sizeof(mainThread.name)); + + S_Thread::s_numthreads++; + + // TODO + /* + if (StormGetOption(8, &v32, v33)) { + auto& cdThread = S_Thread::s_threads[S_Thread::s_numthreads]; + cdThread.suspended = 0; + cdThread.live = 1; + cdThread.threadId = v32.cdThreadId; + cdThread.threadH = v32.threadH; + SStrCopy(cdThread.name, "CdThreadProc", sizeof(cdThread.name)); + + S_Thread::s_numthreads++; + } + */ + } + + void* m = SMemAlloc(sizeof(SThreadParmBlock), __FILE__, __LINE__, 0x8); + auto params = new (m) SThreadParmBlock(); + params->threadProc = threadProc; + params->threadParam = threadParam; + + DWORD threadId; + // TODO pass dwStackSize and dwCreationFlags through to CreateThread + HANDLE threadH = CreateThread(nullptr, 0, S_Thread::s_SLaunchThread, params, CREATE_SUSPENDED, &threadId); + params->threadH = threadH; + + auto& thread = S_Thread::s_threads[S_Thread::s_numthreads]; + thread.suspended = 0; // TODO set from dwCreationFlags + thread.live = 1; + thread.threadId = threadId; + thread.threadH = threadH; + + if (threadName) { + SStrCopy(thread.name, threadName, sizeof(thread.name)); + } + + S_Thread::s_numthreads++; + + // TODO + // S_Thread::s_threadCrit.Leave(); + + return threadH; }