refactor: Move grow logic into PQ API

master
Sean McBride 3 years ago
parent 08a0f03cd5
commit 8a170e1a64

@ -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

@ -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");
}
}

Loading…
Cancel
Save