示例#1
0
文件: rtaskqueue.c 项目: ieei/rlib
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);
  }
}
示例#2
0
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;
}
示例#4
0
R_API void r_id_pool_free(RIDPool* pool) {
	if (pool && pool->freed_ids) {
		r_queue_free (pool->freed_ids);
	}
	free (pool);
}