Esempio n. 1
0
/* pop task */
int qindex_pop_task(QINDEX *qindex, QTASK *task)
{
    int taskid = -1, nodeid = -1, id = -1;
    QTASK *tasks = NULL;

    if(qindex && task && QTOTAL(qindex->queue) > 0)
    {
        MUTEX_LOCK(qindex->mutex);
        iqueue_pop(qindex->queue, &taskid);
        if(taskid >= 0 && taskid < (Q_TASKS_MAX * Q_NODE_MAX)
                && (nodeid = taskid/Q_TASKS_MAX) < Q_NODE_MAX
                && (tasks = qindex->state->nodes[nodeid].tasks)
                && (id = (taskid % Q_TASKS_MAX)) >= 0)
        {
            memcpy(task, &(tasks[id]), sizeof(QTASK));
        }
        else taskid = -1;
        MUTEX_UNLOCK(qindex->mutex);
    }
    return taskid;
}
Esempio n. 2
0
static void queue_test_basic_operation(iobject* queue) {
	iqueue_clear(queue);
	dbg_assert(iqueue_size(queue) == 0);
	dbg_assert(iqueue_empty(queue));

	iqueue_push(queue, (void*)(intptr_t)1);
	iqueue_push(queue, (void*)(intptr_t)2);
	iqueue_push(queue, (void*)(intptr_t)3);
	iqueue_push(queue, (void*)(intptr_t)4);
	iqueue_push(queue, (void*)(intptr_t)5);
	iqueue_push(queue, (void*)(intptr_t)6);
	iqueue_push(queue, (void*)(intptr_t)7);
	iqueue_push(queue, (void*)(intptr_t)8);
	/* now the queue contains { 1, 2, 3, 4, 5, 6, 7, 8 } */

	/* test pop */
	dbg_assert(iqueue_size(queue) == 8);
	{
		/* now the queue contains { 1, 2, 3, 4, 5, 6, 7, 8 } */
		intptr_t counter = 1;
		intptr_t element;

		dbg_assert(iqueue_front(queue) == (void*)(intptr_t)1);
		dbg_assert(iqueue_back (queue) == (void*)(intptr_t)8);

		for (counter = 1; counter <= 8; counter ++) {
			element = (intptr_t)iqueue_pop(queue);
			dbg_assert(element == counter);
		}
	}

	/* test intersect push and pop */
	{
		intptr_t element = 0;

		dbg_assert(iqueue_empty(queue));
		iqueue_push(queue, (void*)(intptr_t)1);
		iqueue_push(queue, (void*)(intptr_t)2);
		/* push two element, now is { 1, 2 } */
		dbg_assert(iqueue_empty(queue) == false);
		dbg_assert(iqueue_size (queue) == 2);
		dbg_assert(iqueue_front(queue) == (void*)(intptr_t)1);
		dbg_assert(iqueue_back (queue) == (void*)(intptr_t)2);

		element = (intptr_t)iqueue_pop(queue);
		/* remove the front one, now is { 2 } */
		dbg_assert(element == 1);
		dbg_assert(iqueue_empty(queue) == false);
		dbg_assert(iqueue_size (queue) == 1);
		dbg_assert(iqueue_front(queue) == (void*)(intptr_t)2);
		dbg_assert(iqueue_back (queue) == (void*)(intptr_t)2);

		iqueue_push(queue, (void*)(intptr_t)3);
		iqueue_push(queue, (void*)(intptr_t)4);
		/* push another 2 element, now is { 2, 3, 4 } */
		dbg_assert(iqueue_empty(queue) == false);
		dbg_assert(iqueue_size (queue) == 3);
		dbg_assert(iqueue_front(queue) == (void*)(intptr_t)2);
		dbg_assert(iqueue_back (queue) == (void*)(intptr_t)4);

		/* continous pop all of them */
		element = (intptr_t)iqueue_pop(queue);
		/* remove the front one, now is { 3, 4 } */
		dbg_assert(element == 2);
		dbg_assert(iqueue_empty(queue) == false);
		dbg_assert(iqueue_size (queue) == 2);
		dbg_assert(iqueue_front(queue) == (void*)(intptr_t)3);
		dbg_assert(iqueue_back (queue) == (void*)(intptr_t)4);

		element = (intptr_t)iqueue_pop(queue);
		/* remove the front one, now is { 4 } */
		dbg_assert(element == 3);
		dbg_assert(iqueue_empty(queue) == false);
		dbg_assert(iqueue_size (queue) == 1);
		dbg_assert(iqueue_front(queue) == (void*)(intptr_t)4);
		dbg_assert(iqueue_back (queue) == (void*)(intptr_t)4);

		element = (intptr_t)iqueue_pop(queue);
		/* remove the front one, now is {} */
		dbg_assert(element == 4);
		dbg_assert(iqueue_empty(queue) == true);
		dbg_assert(iqueue_size (queue) == 0);
		dbg_assert(iqueue_front(queue) == (void*)(intptr_t)NULL);
		dbg_assert(iqueue_back (queue) == (void*)(intptr_t)NULL);

		/* trying to pop empty queue */
		element = (intptr_t)iqueue_pop(queue);
		dbg_assert(element == (intptr_t)NULL);
		dbg_assert(iqueue_empty(queue) == true);
		dbg_assert(iqueue_size (queue) == 0);
		dbg_assert(iqueue_front(queue) == (void*)(intptr_t)NULL);
		dbg_assert(iqueue_back (queue) == (void*)(intptr_t)NULL);

		/* trying to push an element after pop empty queue */
		iqueue_push(queue, (void*)(intptr_t)1);
		dbg_assert(iqueue_empty(queue) == false);
		dbg_assert(iqueue_size (queue) == 1);
		dbg_assert(iqueue_front(queue) == (void*)(intptr_t)1);
		dbg_assert(iqueue_back (queue) == (void*)(intptr_t)1);
	}

	/* test unique element */
	{
		intptr_t element = 0;
		iqueue_clear(queue);

		iqueue_push(queue, (void*)(intptr_t)1);
		iqueue_push(queue, (void*)(intptr_t)1);
		iqueue_push(queue, (void*)(intptr_t)1);
		/* now the queue is { 1, 1, 1 } */
		dbg_assert(iqueue_empty(queue) == false);
		dbg_assert(iqueue_size (queue) == 3);
		dbg_assert(iqueue_front(queue) == (void*)(intptr_t)1);
		dbg_assert(iqueue_back (queue) == (void*)(intptr_t)1);

		element = (intptr_t)iqueue_pop(queue);
		/* remove the front one, now is { 1, 1 } */
		dbg_assert(element == 1);
		dbg_assert(iqueue_empty(queue) == false);
		dbg_assert(iqueue_size (queue) == 2);
		dbg_assert(iqueue_front(queue) == (void*)(intptr_t)1);
		dbg_assert(iqueue_back (queue) == (void*)(intptr_t)1);

		iqueue_push(queue, (void*)(intptr_t)1);
		/* now the queue is { 1, 1, 1 } */
		dbg_assert(iqueue_empty(queue) == false);
		dbg_assert(iqueue_size (queue) == 3);
		dbg_assert(iqueue_front(queue) == (void*)(intptr_t)1);
		dbg_assert(iqueue_back (queue) == (void*)(intptr_t)1);

		iqueue_clear(queue);
	}
}
Esempio n. 3
0
static void queue_test_basic_operation(_object* queue, struct test_data_desc* td_desc) {
	address *test_data_addr   = td_desc->data_repo;
	unknown_traits *td_traits = td_desc->data_traits;
	iqueue_clear(queue);
	dbg_assert(iqueue_size(queue) == 0);
	dbg_assert(iqueue_empty(queue));


	iqueue_push(queue, test_data_addr[1]);
	iqueue_push(queue, test_data_addr[2]);
	iqueue_push(queue, test_data_addr[3]);
	iqueue_push(queue, test_data_addr[4]);
	iqueue_push(queue, test_data_addr[5]);
	iqueue_push(queue, test_data_addr[6]);
	iqueue_push(queue, test_data_addr[7]);
	iqueue_push(queue, test_data_addr[8]);
	/* now the queue contains { 1, 2, 3, 4, 5, 6, 7, 8 } */

	/* test pop */
	dbg_assert(iqueue_size(queue) == 8);
	{
		/* now the queue contains { 1, 2, 3, 4, 5, 6, 7, 8 } */
		intptr_t counter = 1;

		dbg_assert(td_traits->__equals(iqueue_front(queue), test_data_addr[1]));
		dbg_assert(td_traits->__equals(iqueue_back (queue), test_data_addr[8]));

		for (counter = 1; counter <= 8; counter ++) {
			iqueue_pop(queue);
		}
	}

	/* test intersect push and pop */
	{
		dbg_assert(iqueue_empty(queue));

		iqueue_push(queue, test_data_addr[1]);
		iqueue_push(queue, test_data_addr[2]);
		/* push two element, now is { 1, 2 } */
		dbg_assert(iqueue_empty(queue) == false);
		dbg_assert(iqueue_size (queue) == 2);
		dbg_assert(td_traits->__equals(iqueue_front(queue), test_data_addr[1]));
		dbg_assert(td_traits->__equals(iqueue_back (queue), test_data_addr[2]));

		iqueue_pop(queue);
		/* remove the front one, now is { 2 } */
		dbg_assert(iqueue_empty(queue) == false);
		dbg_assert(iqueue_size (queue) == 1);
		dbg_assert(td_traits->__equals(iqueue_front(queue), test_data_addr[2]));
		dbg_assert(td_traits->__equals(iqueue_back (queue), test_data_addr[2]));


		iqueue_push(queue, test_data_addr[3]);
		iqueue_push(queue, test_data_addr[4]);
		/* push another 2 element, now is { 2, 3, 4 } */
		dbg_assert(iqueue_empty(queue) == false);
		dbg_assert(iqueue_size (queue) == 3);
		dbg_assert(td_traits->__equals(iqueue_front(queue), test_data_addr[2]));
		dbg_assert(td_traits->__equals(iqueue_back (queue), test_data_addr[4]));

		/* continuous pop all of them */
		iqueue_pop(queue);
		/* remove the front one, now is { 3, 4 } */
		dbg_assert(iqueue_empty(queue) == false);
		dbg_assert(iqueue_size (queue) == 2);
		dbg_assert(td_traits->__equals(iqueue_front(queue), test_data_addr[3]));
		dbg_assert(td_traits->__equals(iqueue_back (queue), test_data_addr[4]));

		iqueue_pop(queue);
		/* remove the front one, now is { 4 } */
		dbg_assert(iqueue_empty(queue) == false);
		dbg_assert(iqueue_size (queue) == 1);
		dbg_assert(td_traits->__equals(iqueue_front(queue), test_data_addr[4]));
		dbg_assert(td_traits->__equals(iqueue_back (queue), test_data_addr[4]));

		iqueue_pop(queue);
		/* remove the front one, now is {} */
		dbg_assert(iqueue_empty(queue) == true);
		dbg_assert(iqueue_size (queue) == 0);
		dbg_assert(iqueue_front(queue) == NULL);
		dbg_assert(iqueue_back (queue) == NULL);

		/* trying to pop empty queue */
		iqueue_pop(queue);
		dbg_assert(iqueue_empty(queue) == true);
		dbg_assert(iqueue_size (queue) == 0);
		dbg_assert(iqueue_front(queue) == NULL);
		dbg_assert(iqueue_back (queue) == NULL);

		/* trying to push an element after pop empty queue */
		iqueue_push(queue, test_data_addr[1]);
		dbg_assert(iqueue_empty(queue) == false);
		dbg_assert(iqueue_size (queue) == 1);
		dbg_assert(td_traits->__equals(iqueue_front(queue), test_data_addr[1]));
		dbg_assert(td_traits->__equals(iqueue_back (queue), test_data_addr[1]));
	}

	/* test unique element */
	{
		iqueue_clear(queue);

		iqueue_push(queue, test_data_addr[1]);
		iqueue_push(queue, test_data_addr[1]);
		iqueue_push(queue, test_data_addr[1]);
		/* now the queue is { 1, 1, 1 } */
		dbg_assert(iqueue_empty(queue) == false);
		dbg_assert(iqueue_size (queue) == 3);
		dbg_assert(td_traits->__equals(iqueue_front(queue), test_data_addr[1]));
		dbg_assert(td_traits->__equals(iqueue_back (queue), test_data_addr[1]));

		iqueue_pop(queue);
		/* remove the front one, now is { 1, 1 } */
		dbg_assert(iqueue_empty(queue) == false);
		dbg_assert(iqueue_size (queue) == 2);
		dbg_assert(td_traits->__equals(iqueue_front(queue), test_data_addr[1]));
		dbg_assert(td_traits->__equals(iqueue_back (queue), test_data_addr[1]));

		iqueue_push(queue, test_data_addr[1]);
		/* now the queue is { 1, 1, 1 } */
		dbg_assert(iqueue_empty(queue) == false);
		dbg_assert(iqueue_size (queue) == 3);
		dbg_assert(td_traits->__equals(iqueue_front(queue), test_data_addr[1]));
		dbg_assert(td_traits->__equals(iqueue_back (queue), test_data_addr[1]));

		iqueue_clear(queue);
	}
}