aboutsummaryrefslogtreecommitdiff
path: root/source/object.c
diff options
context:
space:
mode:
authornodist <kevin.comas.git@gmail.com>2026-10-12 11:06:37 -0400
committernodist <kevin.comas.git@gmail.com>2026-10-12 11:06:37 -0400
commit332c114cf633f70027c28ec6bedb898d9de85e51 (patch)
tree0a9bb4760772e5e407c1aef9b896d65165f82f6c /source/object.c
parent4ee5b8d6a9ebf49ce30ff7d93ef7401039ffecc6 (diff)
basic allocator with valgrind testing
Diffstat (limited to 'source/object.c')
-rw-r--r--source/object.c34
1 files changed, 34 insertions, 0 deletions
diff --git a/source/object.c b/source/object.c
new file mode 100644
index 0000000..d569df0
--- /dev/null
+++ b/source/object.c
@@ -0,0 +1,34 @@
+
+#include "kpl.h"
+
+extern inline void kpl_object_queue_init(kpl_object_queue *object_queue);
+
+extern inline void kpl_object_queue_enqueue(kpl_object_queue *object_queue, void *object);
+
+void *kpl_object_queue_dequeue(kpl_object_queue *object_queue) {
+ kpl_object *object = NULL;
+ for (;;) {
+ kpl_object *tail = object_queue->tail, *queue_next = __atomic_load_n(&tail->queue_next, __ATOMIC_ACQUIRE);
+ if (tail == (kpl_object*) &object_queue->dummy) {
+ if (!queue_next)
+ break;
+ tail = object_queue->tail = queue_next;
+ queue_next = __atomic_load_n(&tail->queue_next, __ATOMIC_ACQUIRE);
+ }
+ if (!queue_next) {
+ kpl_object *head = __atomic_load_n(&object_queue->head, __ATOMIC_ACQUIRE);
+ if (head != tail)
+ continue;
+ kpl_object_queue_enqueue(object_queue, (kpl_object*) &object_queue->dummy);
+ queue_next = __atomic_load_n(&tail->queue_next, __ATOMIC_ACQUIRE);
+ }
+ if (queue_next) {
+ object_queue->tail = queue_next;
+ object = tail;
+ break;
+ }
+ }
+ if (object)
+ __atomic_store_n(&object->queue_next, NULL, __ATOMIC_RELAXED);
+ return object;
+}