From 20d28e80a5c861a9d5f449ea911ab75b4f37ad0d Mon Sep 17 00:00:00 2001 From: Jef Date: Tue, 24 Sep 2024 14:54:57 +0200 Subject: Initial community commit --- Src/nu/threadpool/ThreadID.h | 56 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 Src/nu/threadpool/ThreadID.h (limited to 'Src/nu/threadpool/ThreadID.h') diff --git a/Src/nu/threadpool/ThreadID.h b/Src/nu/threadpool/ThreadID.h new file mode 100644 index 00000000..e5d1e09e --- /dev/null +++ b/Src/nu/threadpool/ThreadID.h @@ -0,0 +1,56 @@ +#pragma once +#include +#include "ThreadFunctions.h" +#include "threadpool_types.h" +#include + + +class ThreadID : private ThreadFunctions +{ +public: + static DWORD CALLBACK thread_func_stub(LPVOID param); + ThreadID(ThreadFunctions *t_f, HANDLE killswitch, HANDLE global_functions_semaphore, ThreadPoolTypes::HandleList &inherited_handles, volatile LONG *thread_count, HANDLE _max_load_event, int _reserved, int _com_type); + ~ThreadID(); + void Kill(); + + /* Try and Wait must be paired!!! */ + bool TryAddHandle(HANDLE new_handle); + void WaitAddHandle(HANDLE new_handle); + void AddHandle(HANDLE new_handle); + + /* Try and Wait must be paired!!! */ + bool TryRemoveHandle(HANDLE handle); + void WaitRemoveHandle(HANDLE handle); + void RemoveHandle(HANDLE handle); + + using ThreadFunctions::QueueFunction; + bool IsReserved() const; + bool IsReleased() const; + bool CanRunCOM(int flags) const; + void Reserve(); // re-reserves a released thread + void Release(); // release a reversed thread +private: + void RemoveHandle_Internal(HANDLE handle); + DWORD CALLBACK ThreadFunction(); + + int reserved; + ThreadFunctions *global_functions; + volatile LONG *num_threads_available; + int com_type; + bool released; + + ThreadFunctions local_functions; + + // list of handles we're waiting on + typedef std::vector HandleList; + HandleList wait_handles; + CRITICAL_SECTION handle_lock; + + // handles we create/own + HANDLE threadHandle; + HANDLE wakeHandle; + + // handles given to us + HANDLE max_load_event; + +}; -- cgit