X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=lib%2Fqueue.c;h=04610cfa29699b3cb0b3050e9ac063c18434b016;hb=refs%2Fheads%2Ffor-nox%2F0.4;hp=586ae52a00e95b09f7db6f3c6fb0ec48f1a05c64;hpb=d819180e3d31f8adc393e098530830f8fdf2750f;p=sliver-openvswitch.git diff --git a/lib/queue.c b/lib/queue.c index 586ae52a0..04610cfa2 100644 --- a/lib/queue.c +++ b/lib/queue.c @@ -31,15 +31,16 @@ * derivatives without specific, written prior permission. */ +#include #include "queue.h" #include -#include "buffer.h" +#include "ofpbuf.h" -static void check_queue(struct queue *q); +static void check_queue(struct ofp_queue *q); /* Initializes 'q' as an empty packet queue. */ void -queue_init(struct queue *q) +queue_init(struct ofp_queue *q) { q->n = 0; q->head = NULL; @@ -48,18 +49,18 @@ queue_init(struct queue *q) /* Destroys 'q' and all of the packets that it contains. */ void -queue_destroy(struct queue *q) +queue_destroy(struct ofp_queue *q) { - struct buffer *cur, *next; + struct ofpbuf *cur, *next; for (cur = q->head; cur != NULL; cur = next) { next = cur->next; - buffer_delete(cur); + ofpbuf_delete(cur); } } /* Removes and destroys all of the packets in 'q', rendering it empty. */ void -queue_clear(struct queue *q) +queue_clear(struct ofp_queue *q) { queue_destroy(q); queue_init(q); @@ -72,7 +73,7 @@ queue_clear(struct queue *q) * passed to a function for possible consumption (and destruction) and only * dropped from the queue if that function actually accepts it. */ void -queue_advance_head(struct queue *q, struct buffer *next) +queue_advance_head(struct ofp_queue *q, struct ofpbuf *next) { assert(q->n); assert(q->head); @@ -85,7 +86,7 @@ queue_advance_head(struct queue *q, struct buffer *next) /* Appends 'b' to the tail of 'q'. */ void -queue_push_tail(struct queue *q, struct buffer *b) +queue_push_tail(struct ofp_queue *q, struct ofpbuf *b) { check_queue(q); @@ -100,12 +101,23 @@ queue_push_tail(struct queue *q, struct buffer *b) check_queue(q); } +/* Removes the first buffer from 'q', which must not be empty, and returns + * it. The caller must free the buffer (with ofpbuf_delete()) when it is no + * longer needed. */ +struct ofpbuf * +queue_pop_head(struct ofp_queue *q) +{ + struct ofpbuf *head = q->head; + queue_advance_head(q, head->next); + return head; +} + /* Checks the internal integrity of 'q'. For use in debugging. */ static void -check_queue(struct queue *q) +check_queue(struct ofp_queue *q) { #if 0 - struct buffer *iter; + struct ofpbuf *iter; size_t n; assert(q->n == 0