summaryrefslogtreecommitdiff
path: root/src/deque.h
diff options
context:
space:
mode:
authorsteven-na <noreply.github@stvnc.dev>2026-08-11 02:20:18 -0700
committersteven-na <noreply.github@stvnc.dev>2026-08-11 02:20:18 -0700
commit74488135570653300a3b52835e15b6195cfee69c (patch)
treef7930bffdb04a874b63b316fe900668e408f6ca8 /src/deque.h
parentcd11935a0e50b0098c96c5eea8dc20420b31360e (diff)
Deque with thread safe manager (untested)
Diffstat (limited to 'src/deque.h')
-rw-r--r--src/deque.h43
1 files changed, 43 insertions, 0 deletions
diff --git a/src/deque.h b/src/deque.h
new file mode 100644
index 0000000..26b686e
--- /dev/null
+++ b/src/deque.h
@@ -0,0 +1,43 @@
+#pragma once
+
+#include "common.h"
+#include "smrt_arena.h"
+
+#include <bits/pthreadtypes.h>
+#include <pthread.h>
+#include <semaphore.h>
+
+#define EZ_DEQUE_BASE_POS (sizeof(ez_deque_t))
+
+typedef struct {
+ u64 size;
+ u64 occupied;
+ u64 front;
+ u64 back;
+ u64 element_size_bytes;
+} ez_deque_t;
+
+#define SMRTA_ALLOC_EZDEQUE(arena, T, n) (ez_deque_t*)ez_deq_create((arena), sizeof(T), (n))
+
+ez_deque_t *ez_deque_create(smrt_arena_t *arena, u64 elem_size, u64 size);
+
+// Returns false if queue can't hold elem.
+ b32 ez_deque_enqueue(ez_deque_t *q, void *elem);
+// Returns deque backed memory. Copy if needed.
+ void * ez_deque_pop(ez_deque_t *q);
+
+// Thread-safe deque (SPMC)
+// Does not own queue
+typedef struct {
+ ez_deque_t * queue;
+pthread_mutex_t *write_lock;
+ sem_t * count_sem;
+} ts_deque_t;
+
+ts_deque_t ts_deque_create(ez_deque_t * q);
+ void ts_deque_destroy(ts_deque_t tsq);
+
+// Deal with re-enqueueing yourself
+ b32 ts_deque_enqueue(ts_deque_t tsq ,
+ void *elem);
+ void * ts_deque_pop(ts_deque_t tsq);