aboutsummaryrefslogtreecommitdiff
path: root/Src/replicant/nu/win/MessageLoop.h
diff options
context:
space:
mode:
authorJef <jef@targetspot.com>2024-09-24 08:54:57 -0400
committerJef <jef@targetspot.com>2024-09-24 08:54:57 -0400
commit20d28e80a5c861a9d5f449ea911ab75b4f37ad0d (patch)
tree12f17f78986871dd2cfb0a56e5e93b545c1ae0d0 /Src/replicant/nu/win/MessageLoop.h
parent537bcbc86291b32fc04ae4133ce4d7cac8ebe9a7 (diff)
downloadwinamp-20d28e80a5c861a9d5f449ea911ab75b4f37ad0d.tar.gz
Initial community commit
Diffstat (limited to 'Src/replicant/nu/win/MessageLoop.h')
-rw-r--r--Src/replicant/nu/win/MessageLoop.h45
1 files changed, 45 insertions, 0 deletions
diff --git a/Src/replicant/nu/win/MessageLoop.h b/Src/replicant/nu/win/MessageLoop.h
new file mode 100644
index 00000000..88e4520f
--- /dev/null
+++ b/Src/replicant/nu/win/MessageLoop.h
@@ -0,0 +1,45 @@
+#pragma once
+#include "foundation/types.h"
+#include "nu/lfmpscq.h"
+#include "nu/LockFreeLIFO.h"
+#include <windows.h>
+
+namespace nu
+{
+
+ /* you can inherit from message_node_t (or combine inside a struct)
+ but make sure that your message isn't > 64 bytes */
+ struct message_node_t : public queue_node_t
+ {
+ uint32_t message;
+ };
+
+ class MessageLoop
+ {
+ public:
+ MessageLoop();
+ ~MessageLoop();
+ /* API for Message senders */
+ message_node_t *AllocateMessage(); // returns a message for you to fill out
+ void PostMessage(message_node_t *message);
+
+ /* API for Message receivers */
+ void FreeMessage(message_node_t *message);
+ message_node_t *GetMessage(); // waits forever
+ message_node_t *PeekMessage();
+ message_node_t *PeekMessage(unsigned int milliseconds);
+ private:
+ void RefillCache();
+
+ HANDLE message_notification;
+ mpscq_t message_queue;
+
+ /* Memory cache to be able to run APCs without having the memory manager lock
+ we'll allocate 100 at a time (#defined by MESSAGE_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 message_cache holds the individual pointers */
+ static lifo_t message_cache;
+ static lifo_t cache_bases;
+ };
+} \ No newline at end of file