aboutsummaryrefslogtreecommitdiff
path: root/Src/nu/threadpool/api_threadpool.h
diff options
context:
space:
mode:
Diffstat (limited to 'Src/nu/threadpool/api_threadpool.h')
-rw-r--r--Src/nu/threadpool/api_threadpool.h92
1 files changed, 92 insertions, 0 deletions
diff --git a/Src/nu/threadpool/api_threadpool.h b/Src/nu/threadpool/api_threadpool.h
new file mode 100644
index 00000000..4cf5ab4f
--- /dev/null
+++ b/Src/nu/threadpool/api_threadpool.h
@@ -0,0 +1,92 @@
+#pragma once
+
+#include <windows.h>
+#include <bfc/platform/types.h>
+#include <bfc/dispatch.h>
+
+class ThreadID;
+
+class api_threadpool : public Dispatchable
+{
+protected:
+ api_threadpool() {}
+ ~api_threadpool() {}
+public:
+ typedef int (*ThreadPoolFunc)(HANDLE handle, void *user_data, intptr_t id);
+ enum
+ {
+ // pass this flag to AddHandle or RunFunction indicate that your thread function
+ // might run for a long time
+ FLAG_LONG_EXECUTION = 0x1,
+ FLAG_REQUIRE_COM_STA = 0x2,
+ FLAG_REQUIRE_COM_MT = 0x4,
+ MASK_COM_FLAGS = 0x6,
+ };
+
+public:
+ ThreadID *ReserveThread(int flags);
+ /* Release a thread you've previously reserved */
+ void ReleaseThread(ThreadID *thread_id);
+
+ /* adds a waitable handle to the thread pool. when the event is signalled, your function ptr will get called
+ user_data and id values get passed to your function.
+ your function should return 1 to indicate that it can be removed
+ flags, see api_threadpool */
+ int AddHandle(ThreadID *threadid, HANDLE handle, api_threadpool::ThreadPoolFunc func, void *user_data, intptr_t id, int flags);
+ void RemoveHandle(ThreadID *threadid, HANDLE handle);
+ int RunFunction(ThreadID *threadid, api_threadpool::ThreadPoolFunc func, void *user_data, intptr_t id, int flags);
+
+ size_t GetNumberOfThreads(); // total number of threads in the threadpool
+ size_t GetNumberOfActiveThreads(); // number of threads that are currently being used (inside user function but not necessarily busy)
+
+ enum
+ {
+ RESERVETHREAD = 0,
+ RELEASETHREAD = 1,
+ ADDHANDLE = 2,
+ REMOVEHANDLE = 3,
+ RUNFUNCTION = 4,
+ GETNUMBEROFTHREADS = 5,
+ GETNUMBEROFACTIVETHREADS = 6,
+ };
+};
+
+inline ThreadID *api_threadpool::ReserveThread(int flags)
+{
+ return _call(RESERVETHREAD, (ThreadID *)0, flags);
+}
+
+inline void api_threadpool::ReleaseThread(ThreadID *thread_id)
+{
+ _voidcall(RELEASETHREAD, thread_id);
+}
+
+inline int api_threadpool::AddHandle(ThreadID *threadid, HANDLE handle, api_threadpool::ThreadPoolFunc func, void *user_data, intptr_t id, int flags)
+{
+ return _call(ADDHANDLE, (int)1, threadid, handle, func, user_data, id, flags);
+}
+
+inline void api_threadpool::RemoveHandle(ThreadID *threadid, HANDLE handle)
+{
+ _voidcall(REMOVEHANDLE, threadid, handle);
+}
+
+inline int api_threadpool::RunFunction(ThreadID *threadid, api_threadpool::ThreadPoolFunc func, void *user_data, intptr_t id, int flags)
+{
+ return _call(RUNFUNCTION, (int)1, threadid, func, user_data, id, flags);
+}
+
+inline size_t api_threadpool::GetNumberOfThreads()
+{
+ return _call(GETNUMBEROFTHREADS, (size_t)0);
+}
+
+inline size_t api_threadpool::GetNumberOfActiveThreads()
+{
+ return _call(GETNUMBEROFACTIVETHREADS, (size_t)0);
+}
+
+// {4DE015D3-11D8-4ac6-A3E6-216DF5252107}
+static const GUID ThreadPoolGUID =
+{ 0x4de015d3, 0x11d8, 0x4ac6, { 0xa3, 0xe6, 0x21, 0x6d, 0xf5, 0x25, 0x21, 0x7 } };
+