diff options
Diffstat (limited to 'Src/nu/threadpool/ThreadID.h')
-rw-r--r-- | Src/nu/threadpool/ThreadID.h | 56 |
1 files changed, 56 insertions, 0 deletions
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 <windows.h> +#include "ThreadFunctions.h" +#include "threadpool_types.h" +#include <vector> + + +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<HANDLE> HandleList; + HandleList wait_handles; + CRITICAL_SECTION handle_lock; + + // handles we create/own + HANDLE threadHandle; + HANDLE wakeHandle; + + // handles given to us + HANDLE max_load_event; + +}; |