From 8a170e1a6446c444c84baa3ed97e63b802f05f81 Mon Sep 17 00:00:00 2001 From: Sean McBride Date: Thu, 7 Apr 2022 17:04:31 -0400 Subject: [PATCH] refactor: Move grow logic into PQ API --- runtime/include/priority_queue.h | 23 +++++++++++++++++++++++ runtime/src/local_runqueue_minheap.c | 27 ++------------------------- 2 files changed, 25 insertions(+), 25 deletions(-) diff --git a/runtime/include/priority_queue.h b/runtime/include/priority_queue.h index 3833f46..79aa992 100644 --- a/runtime/include/priority_queue.h +++ b/runtime/include/priority_queue.h @@ -286,6 +286,29 @@ priority_queue_initialize(size_t capacity, bool use_lock, priority_queue_get_pri return priority_queue; } +/** + * Double capacity of priority queue + * @param priority_queue to resize + * @returns pointer to PR. This may have been moved by realloc! + */ +static inline struct priority_queue * +priority_queue_grow(struct priority_queue *priority_queue) +{ + assert(priority_queue != NULL); + + if (unlikely(priority_queue->capacity == 0)) { + priority_queue->capacity++; + debuglog("Growing to 1\n"); + } else { + priority_queue->capacity *= 2; + debuglog("Growing to %zu\n", priority_queue->capacity); + } + + /* capacity is padded by 1 because idx 0 is unused */ + return (struct priority_queue *)realloc(priority_queue, sizeof(struct priority_queue) + + sizeof(void *) * (priority_queue->capacity + 1)); +} + /** * Free the Priority Queue Data structure * @param priority_queue the priority_queue to initialize diff --git a/runtime/src/local_runqueue_minheap.c b/runtime/src/local_runqueue_minheap.c index 596303a..6db81f7 100644 --- a/runtime/src/local_runqueue_minheap.c +++ b/runtime/src/local_runqueue_minheap.c @@ -27,29 +27,6 @@ local_runqueue_minheap_is_empty() return priority_queue_length_nolock(local_runqueue_minheap) == 0; } -/** - * Doubles capacity of local runqueue - */ -void -local_runqueue_minheap_grow(void) -{ - assert(local_runqueue_minheap != NULL); - - if (unlikely(local_runqueue_minheap->capacity == 0)) { - local_runqueue_minheap->capacity++; - debuglog("Growing to 1\n"); - } else { - local_runqueue_minheap->capacity *= 2; - debuglog("Growing to %zu\n", local_runqueue_minheap->capacity); - } - - /* capacity is padded by 1 because idx 0 is unused */ - local_runqueue_minheap = (struct priority_queue *)realloc(local_runqueue_minheap, - sizeof(struct priority_queue) - + sizeof(void *) * local_runqueue_minheap->capacity - + 1); -} - /** * Adds a sandbox to the run queue * @param sandbox @@ -60,8 +37,8 @@ local_runqueue_minheap_add(struct sandbox *sandbox) { int return_code = priority_queue_enqueue_nolock(local_runqueue_minheap, sandbox); if (unlikely(return_code == -ENOSPC)) { - local_runqueue_minheap_grow(); - return_code = priority_queue_enqueue_nolock(local_runqueue_minheap, sandbox); + local_runqueue_minheap = priority_queue_grow(local_runqueue_minheap); + return_code = priority_queue_enqueue_nolock(local_runqueue_minheap, sandbox); if (unlikely(return_code == -ENOSPC)) panic("Thread Runqueue is full!\n"); } }