aboutsummaryrefslogtreecommitdiff
path: root/Src/replicant/nu/win-amd64/ThreadLoop.h
diff options
context:
space:
mode:
Diffstat (limited to 'Src/replicant/nu/win-amd64/ThreadLoop.h')
-rw-r--r--Src/replicant/nu/win-amd64/ThreadLoop.h38
1 files changed, 38 insertions, 0 deletions
diff --git a/Src/replicant/nu/win-amd64/ThreadLoop.h b/Src/replicant/nu/win-amd64/ThreadLoop.h
new file mode 100644
index 00000000..f1552b51
--- /dev/null
+++ b/Src/replicant/nu/win-amd64/ThreadLoop.h
@@ -0,0 +1,38 @@
+#pragma once
+#include "nu/lfmpscq.h"
+#include "nu/LockFreeLIFO.h"
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+
+struct threadloop_node_t : public queue_node_t
+{
+ void (*func)(void *param1, void *param2, double real_value);
+
+ void *param1;
+ void *param2;
+ double real_value;
+};
+
+class ThreadLoop
+{
+public:
+ ThreadLoop();
+ threadloop_node_t *GetAPC(); // returns a node for you to fill out
+ void Schedule(threadloop_node_t *apc);
+ void Run();
+ void Kill();
+private:
+ void RefillCache();
+
+ HANDLE procedure_notification;
+ HANDLE kill_switch;
+ mpscq_t procedure_queue;
+
+ /* Memory cache to be able to run APCs without having the memory manager lock
+ we'll allocate 100 at a time (#defined by PROCEDURE_CACHE_SEED)
+ and allocate new ones only if the cache is empty (which unfortunately will lock)
+ cache_bases holds the pointers we've allocated (to free on destruction of this object)
+ and procedure_cache holds the individual pointers */
+ static lifo_t procedure_cache;
+ static lifo_t cache_bases;
+}; \ No newline at end of file