aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen Pfaff <blp@nicira.com>2011-03-02 13:39:59 -0800
committerBen Pfaff <blp@nicira.com>2011-03-30 15:08:47 -0700
commit7ecb095d0bf4940406ce684c5c6d5c7adac4cf77 (patch)
treeed2810d109839a1f9b4c49e4be0bba576d3251ef
parent19cf40693da2e6e7612268fc6708fc6c879ebdff (diff)
ofpbuf: Make ofpbufs initialized with ofpbuf_use_stack() not expandable.
My original intent for ofpbufs initialized with ofpbuf_use_stack() was that the caller was providing enough space on the stack for the common case, with dynamic allocation as a fallback. But in practice, none of the clients actually do this. Instead, all of them actually know that the stack-allocated buffer is big enough and, since they don't want to bother with having to call ofpbuf_delete(), they instead assert that the buffer wasn't reallocated. Since this is a bit of a pain, this commit changes the semantics of ofpbuf_use_stack() to be that the stack-allocated buffer cannot be reallocated at all. This is more convenient for the existing clients.
-rw-r--r--lib/dpif-netdev.c1
-rw-r--r--lib/ofpbuf.c14
-rw-r--r--lib/ofpbuf.h3
-rw-r--r--ofproto/ofproto.c2
4 files changed, 5 insertions, 15 deletions
diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c
index 762d24b3..486ba486 100644
--- a/lib/dpif-netdev.c
+++ b/lib/dpif-netdev.c
@@ -911,7 +911,6 @@ dpif_netdev_flow_dump_next(const struct dpif *dpif, void *state_,
ofpbuf_use_stack(&buf, &state->keybuf, sizeof state->keybuf);
odp_flow_key_from_flow(&buf, &flow->key);
- assert(buf.base == &state->keybuf);
*key = buf.data;
*key_len = buf.size;
diff --git a/lib/ofpbuf.c b/lib/ofpbuf.c
index 7e965360..8166d6b1 100644
--- a/lib/ofpbuf.c
+++ b/lib/ofpbuf.c
@@ -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:
diff --git a/lib/ofpbuf.h b/lib/ofpbuf.h
index b8e36704..34fcf5f7 100644
--- a/lib/ofpbuf.h
+++ b/lib/ofpbuf.h
@@ -28,8 +28,7 @@ extern "C" {
enum ofpbuf_source {
OFPBUF_MALLOC, /* Obtained via malloc(). */
- OFPBUF_STACK, /* Stack space or static buffer. */
- OFPBUF_CONST /* Must not be expanded. */
+ OFPBUF_STACK /* Stack space or static buffer. */
};
/* Buffer for holding arbitrary data. An ofpbuf is automatically reallocated
diff --git a/ofproto/ofproto.c b/ofproto/ofproto.c
index e6ea69dd..6994b117 100644
--- a/ofproto/ofproto.c
+++ b/ofproto/ofproto.c
@@ -1616,7 +1616,6 @@ facet_put__(struct ofproto *ofproto, struct facet *facet,
ofpbuf_use_stack(&key, &keybuf, sizeof keybuf);
odp_flow_key_from_flow(&key, &facet->flow);
- assert(key.base == &keybuf);
return dpif_flow_put(ofproto->dpif, flags, key.data, key.size,
actions, actions_len, stats);
@@ -1666,7 +1665,6 @@ facet_uninstall(struct ofproto *p, struct facet *facet)
ofpbuf_use_stack(&key, &keybuf, sizeof keybuf);
odp_flow_key_from_flow(&key, &facet->flow);
- assert(key.base == &keybuf);
if (!dpif_flow_del(p->dpif, key.data, key.size, &stats)) {
facet_update_stats(p, facet, &stats);