odp_buffer_hdr_t *pktin_dequeue(queue_entry_t *qentry) { odp_buffer_hdr_t *buf_hdr; buf_hdr = queue_deq(qentry); if (buf_hdr == NULL) { odp_packet_t pkt; odp_buffer_t buf; odp_packet_t pkt_tbl[QUEUE_MULTI_MAX]; odp_buffer_hdr_t *tmp_hdr_tbl[QUEUE_MULTI_MAX]; int pkts, i, j; pkts = odp_pktio_recv(qentry->s.pktin, pkt_tbl, QUEUE_MULTI_MAX); if (pkts > 0) { pkt = pkt_tbl[0]; buf = odp_buffer_from_packet(pkt); buf_hdr = odp_buf_to_hdr(buf); for (i = 1, j = 0; i < pkts; ++i) { buf = odp_buffer_from_packet(pkt_tbl[i]); tmp_hdr_tbl[j++] = odp_buf_to_hdr(buf); } queue_enq_multi(qentry, tmp_hdr_tbl, j); } } return buf_hdr; }
odp_buffer_hdr_t *pktin_dequeue(queue_entry_t *queue) { odp_buffer_hdr_t *buf_hdr; buf_hdr = queue_deq(queue); update_in_packet(buf_hdr, queue->s.pktin); return buf_hdr; }
int main() { char buf[MSG_SIZE]; int ch, e; queue q; printf("\n 1 - Enque"); printf("\n 2 - Deque"); printf("\n 3 - Front element"); printf("\n 4 - Empty"); printf("\n 5 - Exit"); printf("\n 6 - Display"); printf("\n 7 - Queue size"); queue_create(&q); while (1) { printf("\n Enter choice : "); scanf("%d", &ch); switch (ch) { case 1: printf("Enter data : "); scanf("%s", buf); queue_enq(&q, buf); break; case 2: e = queue_deq(&q, buf); puts(buf); if (e == 0) printf("Front element : %s", buf); else printf("\n No front element in Queue as queue is empty"); break; case 3: e = queue_peek(&q, buf); puts(buf); if (e == 0) printf("Front element : %s", buf); else printf("\n No front element in Queue as queue is empty"); break; case 4: queue_empty(&q); break; case 5: exit(0); case 6: queue_display(&q); break; case 7: queue_size(&q); break; default: printf("Wrong choice, Please enter correct choice "); break; } } return 0; }
/* * removes and returns the data of the * first element of the priority queue q */ void *queue_head(struct queue *q) { void *data; int i; i = pulse % NUM_EVENT_QUEUES; if (!q->head[i]) return NULL; data = q->head[i]->data; queue_deq(q, q->head[i]); return data; }
/* removes the event from the system */ void event_cancel(struct event *event) { if (!event) { log("SYSERR: Attempted to cancel a NULL event"); return; } if (!event->q_el) { log("SYSERR: Attempted to cancel a non-NULL unqueued event, freeing anyway"); } else queue_deq(event_q, event->q_el); if (event->event_obj) free(event->event_obj); free(event); }
void test_empty (queue_t queue) { /* Test size empty*/ if (queue_size (queue) != 0) { printf ("Empty Queue: Size Failed\n"); exit (EXIT_FAILURE); } /* Test peek and deq */ if (queue_peek (queue) != NULL || queue_deq (queue) != NULL) { printf ("Empty Queue: Peek / Deq Failed\n"); exit (EXIT_FAILURE); } }
void * consume(void *args) { char *buf; int *bla = args; int id = *bla; printf("Consumer %d launched, waiting for producer...\n", id); while ((buf = queue_deq(q))) { printf("Consumer %d ate '%s'\n", id, buf); fflush(stdout); free(buf); #ifndef NOSLEEP usleep(random() % 100000); #endif } printf("Consumer %d got a NULL, queue consumed, bye!\n", id); return 0; }
void free_queue(queue_t * queue) { while (queue_deq(queue) != NULL); free(queue->head); free(queue); }
int main (int argc, char ** argv) { queue_t queue; size_t i, j, size; stack_t stack_in, stack_out; /* Create a new queue */ queue = queue_init (); if (queue == NULL) { printf ("Failed to initialize the initial queue\n"); return 99; } /* Test empty queue */ test_empty (queue); /* Test a few inserts */ size = 10; for (i = 0; i < size; i++) if (queue_enq (queue, (void*)i) == QUEUE_MALLOC_FAILED) { printf ("Insert: Malloc failed\n"); return 99; } if (size != queue_size (queue)) { printf ("Few Inserts: Size Failed\n"); return EXIT_FAILURE; } for (i = 0; i < size; i++) if (queue_peek (queue) != (void*)i || queue_deq (queue) != (void*)i) { printf ("Few Inserts: Integrity Failed\n"); return EXIT_FAILURE; } /* Test Clear */ queue_clear (queue); test_empty (queue); /* Test Many Inserts */ size = 10000; stack_in = stack_init (); stack_out = stack_init (); if (stack_in == NULL || stack_out == NULL) { printf ("Failed to create stacks\n"); return 99; } for (i = 0; i < size; i++) { /* Queue the elements */ stack_push (stack_in, (void*)i); queue_enq (queue, (void*)i); /* Queue and dequeue many elements */ for (j = 0; j < 100; j++) { stack_push (stack_in, (void*)i); queue_enq (queue, (void*)i); /* Check the queue */ if (queue_peek (queue) != peek (stack_in, stack_out) || queue_deq (queue) != deq (stack_in, stack_out)) { printf ("Many Inserts: Integrity Failed\n"); return EXIT_FAILURE; } } } if (size != queue_size (queue)) { printf ("Many Inserts: Size Failure\n"); return EXIT_FAILURE; } for (i = 0; i < size; i++) if (queue_peek (queue) != peek (stack_in, stack_out) || queue_deq (queue) != deq (stack_in, stack_out)) { printf ("Many Inserts: Integrity Failed\n"); return EXIT_FAILURE; } stack_destroy (stack_in); stack_destroy (stack_out); /* Destroy the queue */ queue_destroy (queue); return EXIT_SUCCESS; }