/* 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; }
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); } }
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); } }