static void r_task_queue_free (RTaskQueue * queue) { if (queue != NULL) { ruint i; for (i = 0; i < queue->ctxcount; i++) { r_mutex_lock (&queue->ctx[i].mutex); R_LOG_TRACE ("TQ: %p [%p] - stop", queue, &queue->ctx[i]); queue->ctx[i].running = FALSE; r_cond_broadcast (&queue->ctx[i].cond); r_mutex_unlock (&queue->ctx[i].mutex); } r_thread_pool_join (queue->pool); r_thread_pool_unref (queue->pool); for (i = 0; i < queue->ctxcount; i++) { r_queue_free (queue->ctx[i].q, r_task_unref); r_cond_clear (&queue->ctx[i].cond); r_mutex_clear (&queue->ctx[i].mutex); } r_cond_clear (&queue->wait_cond); r_mutex_clear (&queue->wait_mutex); r_free (queue->ctx); r_free (queue); } }
R_API bool r_id_pool_grab_id(RIDPool* pool, ut32* grabber) { if (!pool || !grabber) { return false; } if (pool->freed_ids) { ut32 grab = (ut32) (size_t)r_queue_dequeue (pool->freed_ids); *grabber = (ut32) grab; if (r_queue_is_empty (pool->freed_ids)) { r_queue_free (pool->freed_ids); pool->freed_ids = NULL; } return true; } if (pool->next_id < pool->last_id) { *grabber = pool->next_id; pool->next_id++; return true; } return false; }
bool test_r_queue_add_remove(void) { int i, j; // Create queue with max size 5. RQueue* queue = r_queue_new (5); for (i = 0; i < 5; ++i) { mu_assert ("enqueue to available slot", r_queue_enqueue (queue, (void*)(intptr_t)((i + 1) * 10))); } mu_assert_eq (queue->capacity, 5, "original capacity is 5"); mu_assert ("enqueue but it's full! Increase Capacity!", r_queue_enqueue (queue, (void*)(intptr_t)60)); mu_assert_eq (queue->capacity, 10, "new capacity should be double old"); for (i = 0; i < 6; ++i) { j = (int)(intptr_t)r_queue_dequeue (queue); mu_assert_eq (j, (i + 1) * 10, "front item from queue"); } j = (int)(intptr_t)r_queue_dequeue (queue); mu_assert_eq (j, (int)(intptr_t)NULL, "Empty queue dequeue."); r_queue_free (queue); mu_end; }
R_API void r_id_pool_free(RIDPool* pool) { if (pool && pool->freed_ids) { r_queue_free (pool->freed_ids); } free (pool); }