X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=lib%2Fofpbuf.c;h=38874816c1f88679548bb1581b53547c42b5e7b1;hb=9c8e276ec3f4a3368ec1cb7f713543d46d8ad23a;hp=34aad93825126943d4ffbaaaf9be9a8aa2d2b677;hpb=a46c577af5c5855939ca3192a56396e15bebf0f8;p=openvswitch diff --git a/lib/ofpbuf.c b/lib/ofpbuf.c index 34aad938..38874816 100644 --- a/lib/ofpbuf.c +++ b/lib/ofpbuf.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2009, 2010 Nicira Networks. + * Copyright (c) 2008, 2009, 2010, 2011 Nicira Networks. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -47,9 +47,9 @@ ofpbuf_use(struct ofpbuf *b, void *base, size_t allocated) /* Initializes 'b' as an empty ofpbuf that contains the 'allocated' bytes of * memory starting at 'base'. 'base' should point to a buffer on the stack. - * If 'b' is resized, new memory will be allocated with malloc() and 'base' - * will not be freed. This is useful when a small stack-allocated buffer is - * normally appropriate but sometimes it must be expanded. + * + * An ofpbuf operation that requires reallocating data will assert-fail if this + * function was used to initialize it. * * 'base' should be appropriately aligned. Using an array of uint32_t or * uint64_t for the buffer is a reasonable way to ensure appropriate alignment @@ -74,7 +74,7 @@ ofpbuf_use_stack(struct ofpbuf *b, void *base, size_t allocated) void ofpbuf_use_const(struct ofpbuf *b, const void *data, size_t size) { - ofpbuf_use__(b, (void *) data, size, OFPBUF_CONST); + ofpbuf_use__(b, (void *) data, size, OFPBUF_STACK); b->size = size; } @@ -225,12 +225,6 @@ ofpbuf_resize__(struct ofpbuf *b, size_t new_headroom, size_t new_tailroom) break; case OFPBUF_STACK: - new_base = xmalloc(new_allocated); - ofpbuf_copy__(b, new_base, new_headroom, new_tailroom); - b->source = OFPBUF_MALLOC; - break; - - case OFPBUF_CONST: NOT_REACHED(); default: @@ -295,6 +289,16 @@ ofpbuf_trim(struct ofpbuf *b) } } +/* If 'b' is shorter than 'length' bytes, pads its tail out with zeros to that + * length. */ +void +ofpbuf_padto(struct ofpbuf *b, size_t length) +{ + if (b->size < length) { + ofpbuf_put_zeros(b, length - b->size); + } +} + /* Appends 'size' bytes of data to the tail end of 'b', reallocating and * copying its data if necessary. Returns a pointer to the first byte of the * new data, which is left uninitialized. */ @@ -462,6 +466,25 @@ ofpbuf_try_pull(struct ofpbuf *b, size_t size) return b->size >= size ? ofpbuf_pull(b, size) : NULL; } +/* Returns the data in 'b' as a block of malloc()'d memory and frees the buffer + * within 'b'. (If 'b' itself was dynamically allocated, e.g. with + * ofpbuf_new(), then it should still be freed with, e.g., ofpbuf_delete().) */ +void * +ofpbuf_steal_data(struct ofpbuf *b) +{ + void *p; + if (b->source == OFPBUF_MALLOC && b->data == b->base) { + p = b->data; + } else { + p = xmemdup(b->data, b->size); + if (b->source == OFPBUF_MALLOC) { + free(b->base); + } + } + b->base = b->data = NULL; + return p; +} + /* Returns a string that describes some of 'b''s metadata plus a hex dump of up * to 'maxbytes' from the start of the buffer. */ char *