[ovs-dev] [threads v2 08/13] byteq: Make the queue size variable instead of fixed at BYTEQ_SIZE bytes.
Alex Wang
alexw at nicira.com
Wed Jul 17 18:26:06 UTC 2013
Looks good to me,
Just one question, for the code below in "lib/byteq.c"
"""
/* Returns the number of bytes current queued in 'q'. */
int
byteq_used(const struct byteq *q)
{
return q->head - q->tail;
}
"""
Is it possible that the jsonrpc session last so long that the 'q->head'
gets overflowed? or the chance is so slim that we do not care,
Kind Regards,
Alex Wang,
On Fri, Jul 12, 2013 at 2:54 PM, Ben Pfaff <blp at nicira.com> wrote:
> Signed-off-by: Ben Pfaff <blp at nicira.com>
> ---
> lib/byteq.c | 26 +++++++++++++++-----------
> lib/byteq.h | 10 ++++------
> lib/jsonrpc.c | 5 +++--
> 3 files changed, 22 insertions(+), 19 deletions(-)
>
> diff --git a/lib/byteq.c b/lib/byteq.c
> index 2ee4a65..3f865cf 100644
> --- a/lib/byteq.c
> +++ b/lib/byteq.c
> @@ -1,4 +1,4 @@
> -/* Copyright (c) 2008, 2009, 2012 Nicira, Inc.
> +/* Copyright (c) 2008, 2009, 2012, 2013 Nicira, Inc.
> *
> * Licensed under the Apache License, Version 2.0 (the "License");
> * you may not use this file except in compliance with the License.
> @@ -20,13 +20,17 @@
> #include <unistd.h>
> #include "util.h"
>
> -/* The queue size must be a power of 2. */
> -BUILD_ASSERT_DECL(!(BYTEQ_SIZE & (BYTEQ_SIZE - 1)));
> -
> -/* Initializes 'q' as empty. */
> +/* Initializes 'q' as an empty byteq that uses the 'size' bytes of
> 'buffer' to
> + * store data. 'size' must be a power of 2.
> + *
> + * The caller must ensure that 'buffer' remains available to the byteq as
> long
> + * as 'q' is in use. */
> void
> -byteq_init(struct byteq *q)
> +byteq_init(struct byteq *q, uint8_t *buffer, size_t size)
> {
> + ovs_assert(is_pow2(size));
> + q->buffer = buffer;
> + q->size = size;
> q->head = q->tail = 0;
> }
>
> @@ -41,7 +45,7 @@ byteq_used(const struct byteq *q)
> int
> byteq_avail(const struct byteq *q)
> {
> - return BYTEQ_SIZE - byteq_used(q);
> + return q->size - byteq_used(q);
> }
>
> /* Returns true if no bytes are queued in 'q',
> @@ -147,7 +151,7 @@ int
> byteq_tailroom(const struct byteq *q)
> {
> int used = byteq_used(q);
> - int tail_to_end = BYTEQ_SIZE - (q->tail & (BYTEQ_SIZE - 1));
> + int tail_to_end = q->size - (q->tail & (q->size - 1));
> return MIN(used, tail_to_end);
> }
>
> @@ -156,7 +160,7 @@ byteq_tailroom(const struct byteq *q)
> const uint8_t *
> byteq_tail(const struct byteq *q)
> {
> - return &q->buffer[q->tail & (BYTEQ_SIZE - 1)];
> + return &q->buffer[q->tail & (q->size - 1)];
> }
>
> /* Removes 'n' bytes from the tail of 'q', which must have at least 'n'
> bytes
> @@ -173,7 +177,7 @@ byteq_advance_tail(struct byteq *q, unsigned int n)
> uint8_t *
> byteq_head(struct byteq *q)
> {
> - return &q->buffer[q->head & (BYTEQ_SIZE - 1)];
> + return &q->buffer[q->head & (q->size - 1)];
> }
>
> /* Returns the number of contiguous bytes of free space starting at the
> head
> @@ -182,7 +186,7 @@ int
> byteq_headroom(const struct byteq *q)
> {
> int avail = byteq_avail(q);
> - int head_to_end = BYTEQ_SIZE - (q->head & (BYTEQ_SIZE - 1));
> + int head_to_end = q->size - (q->head & (q->size - 1));
> return MIN(avail, head_to_end);
> }
>
> diff --git a/lib/byteq.h b/lib/byteq.h
> index 5fa51fd..d73e368 100644
> --- a/lib/byteq.h
> +++ b/lib/byteq.h
> @@ -1,4 +1,4 @@
> -/* Copyright (c) 2008, 2009 Nicira, Inc.
> +/* Copyright (c) 2008, 2009, 2013 Nicira, Inc.
> *
> * Licensed under the Apache License, Version 2.0 (the "License");
> * you may not use this file except in compliance with the License.
> @@ -20,17 +20,15 @@
> #include <stddef.h>
> #include <stdint.h>
>
> -/* Maximum number of bytes in a byteq. */
> -#define BYTEQ_SIZE 512
> -
> /* General-purpose circular queue of bytes. */
> struct byteq {
> - uint8_t buffer[BYTEQ_SIZE]; /* Circular queue. */
> + uint8_t *buffer; /* Circular queue. */
> + unsigned int size; /* Number of bytes allocated for
> 'buffer'. */
> unsigned int head; /* Head of queue. */
> unsigned int tail; /* Chases the head. */
> };
>
> -void byteq_init(struct byteq *);
> +void byteq_init(struct byteq *, uint8_t *buffer, size_t size);
> int byteq_used(const struct byteq *);
> int byteq_avail(const struct byteq *);
> bool byteq_is_empty(const struct byteq *);
> diff --git a/lib/jsonrpc.c b/lib/jsonrpc.c
> index 56b4cce..b4bbc84 100644
> --- a/lib/jsonrpc.c
> +++ b/lib/jsonrpc.c
> @@ -41,6 +41,7 @@ struct jsonrpc {
>
> /* Input. */
> struct byteq input;
> + uint8_t input_buffer[512];
> struct json_parser *parser;
> struct jsonrpc_msg *received;
>
> @@ -87,7 +88,7 @@ jsonrpc_open(struct stream *stream)
> rpc = xzalloc(sizeof *rpc);
> rpc->name = xstrdup(stream_get_name(stream));
> rpc->stream = stream;
> - byteq_init(&rpc->input);
> + byteq_init(&rpc->input, rpc->input_buffer, sizeof rpc->input_buffer);
> list_init(&rpc->output);
>
> return rpc;
> @@ -330,7 +331,7 @@ jsonrpc_recv(struct jsonrpc *rpc, struct jsonrpc_msg
> **msgp)
> jsonrpc_received(rpc);
> if (rpc->status) {
> const struct byteq *q = &rpc->input;
> - if (q->head <= BYTEQ_SIZE) {
> + if (q->head <= q->size) {
> stream_report_content(q->buffer, q->head,
> STREAM_JSONRPC,
> THIS_MODULE, rpc->name);
> --
> 1.7.2.5
>
> _______________________________________________
> dev mailing list
> dev at openvswitch.org
> http://openvswitch.org/mailman/listinfo/dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.openvswitch.org/pipermail/ovs-dev/attachments/20130717/f4035e43/attachment-0003.html>
More information about the dev
mailing list