aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2022-01-02 15:31:47 +0000
committergingerBill <bill@gingerbill.org>2022-01-02 15:31:47 +0000
commit65434911489fdb5b9136b3b06b279a07137d7415 (patch)
treefc4401caed3552ca298230fbdcbac109d517f4c6
parent3cbf9c37193a2852db9ac52b9d9699169318d277 (diff)
Clean up code for queue (no logic changed)dev-2022-01
-rw-r--r--src/queue.cpp45
1 files changed, 27 insertions, 18 deletions
diff --git a/src/queue.cpp b/src/queue.cpp
index d69a2845c..ee8b1b086 100644
--- a/src/queue.cpp
+++ b/src/queue.cpp
@@ -72,14 +72,38 @@ void mpmc_destroy(MPMCQueue<T> *q) {
template <typename T>
+bool mpmc_internal_grow(MPMCQueue<T> *q) {
+ mutex_lock(&q->mutex);
+ i32 old_size = q->mask+1;
+ i32 new_size = old_size*2;
+ resize_array_raw(&q->nodes, q->allocator, old_size, new_size);
+ if (q->nodes == nullptr) {
+ GB_PANIC("Unable to resize enqueue: %td -> %td", old_size, new_size);
+ mutex_unlock(&q->mutex);
+ return false;
+ }
+ resize_array_raw(&q->indices, q->allocator, old_size, new_size);
+ if (q->indices == nullptr) {
+ GB_PANIC("Unable to resize enqueue: %td -> %td", old_size, new_size);
+ mutex_unlock(&q->mutex);
+ return false;
+ }
+ mpmc_internal_init_indices(q->indices, old_size, new_size);
+ q->mask = new_size-1;
+ mutex_unlock(&q->mutex);
+ return true;
+}
+
+template <typename T>
i32 mpmc_enqueue(MPMCQueue<T> *q, T const &data) {
GB_ASSERT(q->mask != 0);
i32 head_idx = q->head_idx.load(std::memory_order_relaxed);
for (;;) {
- auto node = &q->nodes[head_idx & q->mask];
- auto node_idx_ptr = &q->indices[head_idx & q->mask];
+ i32 index = head_idx & q->mask;
+ auto node = &q->nodes[index];
+ auto node_idx_ptr = &q->indices[index];
i32 node_idx = node_idx_ptr->load(std::memory_order_acquire);
i32 diff = node_idx - head_idx;
@@ -91,24 +115,9 @@ i32 mpmc_enqueue(MPMCQueue<T> *q, T const &data) {
return q->count.fetch_add(1, std::memory_order_release);
}
} else if (diff < 0) {
- mutex_lock(&q->mutex);
- i32 old_size = q->mask+1;
- i32 new_size = old_size*2;
- resize_array_raw(&q->nodes, q->allocator, old_size, new_size);
- if (q->nodes == nullptr) {
- GB_PANIC("Unable to resize enqueue: %td -> %td", old_size, new_size);
- mutex_unlock(&q->mutex);
- return -1;
- }
- resize_array_raw(&q->indices, q->allocator, old_size, new_size);
- if (q->indices == nullptr) {
- GB_PANIC("Unable to resize enqueue: %td -> %td", old_size, new_size);
- mutex_unlock(&q->mutex);
+ if (!mpmc_internal_grow(q)) {
return -1;
}
- mpmc_internal_init_indices(q->indices, old_size, new_size);
- q->mask = new_size-1;
- mutex_unlock(&q->mutex);
} else {
head_idx = q->head_idx.load(std::memory_order_relaxed);
}