diff options
| author | VladPavliuk <pavliuk.vlad@gmail.com> | 2024-07-14 18:22:20 +0300 |
|---|---|---|
| committer | VladPavliuk <pavliuk.vlad@gmail.com> | 2024-07-14 18:22:20 +0300 |
| commit | 3f8712edb03390c1eed4dced27f7c2707cf14ecb (patch) | |
| tree | a186834d911e19418836bf2ca3f52f334c11267a /src/threading.cpp | |
| parent | 79e2f63182581547dcdb7593397d1c3e280a5670 (diff) | |
| parent | e7d37607ef9ce54a80d83230150874b71d628d6d (diff) | |
Merge branch 'master' into json-add-int-key-map-support
Diffstat (limited to 'src/threading.cpp')
| -rw-r--r-- | src/threading.cpp | 39 |
1 files changed, 29 insertions, 10 deletions
diff --git a/src/threading.cpp b/src/threading.cpp index 717dcb874..ff0fdfcde 100644 --- a/src/threading.cpp +++ b/src/threading.cpp @@ -46,6 +46,18 @@ typedef struct WorkerTask { void *data; } WorkerTask; +typedef struct TaskRingBuffer { + std::atomic<isize> size; + std::atomic<WorkerTask *> buffer; +} TaskRingBuffer; + +typedef struct TaskQueue { + std::atomic<isize> top; + std::atomic<isize> bottom; + + std::atomic<TaskRingBuffer *> ring; +} TaskQueue; + struct Thread { #if defined(GB_SYSTEM_WINDOWS) void *win32_handle; @@ -54,12 +66,9 @@ struct Thread { #endif isize idx; + isize stack_size; - WorkerTask *queue; - size_t capacity; - std::atomic<uint64_t> head_and_tail; - - isize stack_size; + struct TaskQueue queue; struct ThreadPool *pool; }; @@ -551,6 +560,18 @@ gb_internal void *internal_thread_proc(void *arg) { } #endif +TaskRingBuffer *task_ring_init(isize size) { + TaskRingBuffer *ring = gb_alloc_item(heap_allocator(), TaskRingBuffer); + ring->size = size; + ring->buffer = gb_alloc_array(heap_allocator(), WorkerTask, ring->size); + return ring; +} + +void thread_queue_destroy(TaskQueue *q) { + gb_free(heap_allocator(), (*q->ring).buffer); + gb_free(heap_allocator(), q->ring); +} + gb_internal void thread_init(ThreadPool *pool, Thread *t, isize idx) { gb_zero_item(t); #if defined(GB_SYSTEM_WINDOWS) @@ -559,14 +580,12 @@ gb_internal void thread_init(ThreadPool *pool, Thread *t, isize idx) { t->posix_handle = 0; #endif - t->capacity = 1 << 14; // must be a power of 2 - t->queue = gb_alloc_array(heap_allocator(), WorkerTask, t->capacity); - t->head_and_tail = 0; + // Size must be a power of 2 + t->queue.ring = task_ring_init(1 << 14); t->pool = pool; t->idx = idx; } - gb_internal void thread_init_and_start(ThreadPool *pool, Thread *t, isize idx) { thread_init(pool, t, idx); isize stack_size = 0; @@ -598,7 +617,7 @@ gb_internal void thread_join_and_destroy(Thread *t) { t->posix_handle = 0; #endif - gb_free(heap_allocator(), t->queue); + thread_queue_destroy(&t->queue); } gb_internal void thread_set_name(Thread *t, char const *name) { |