diff options
| author | Mark Stapp <mjs@voltanet.io> | 2020-04-05 11:48:05 -0400 |
|---|---|---|
| committer | Mark Stapp <mjs@voltanet.io> | 2020-06-02 08:20:54 -0400 |
| commit | f8c511cddb9bc54d190d8bfcded339ed7f3ec219 (patch) | |
| tree | e1d00bc5b3074c2a4f25ad9b7cbcaa91544b75b2 /lib | |
| parent | f981d44931ced06f594b33c54a27d6d843ad0379 (diff) | |
lib: add stream_fifo_init, more const
Add utilities that init and deinit a stream_fifo - this lets us
use an on-stack fifo in some places, avoiding malloc'ing. Also
add const to some apis (no functional changes there).
Signed-off-by: Mark Stapp <mjs@voltanet.io>
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/stream.c | 47 | ||||
| -rw-r--r-- | lib/stream.h | 30 |
2 files changed, 51 insertions, 26 deletions
diff --git a/lib/stream.c b/lib/stream.c index fcfbc78e3d..17520f978e 100644 --- a/lib/stream.c +++ b/lib/stream.c @@ -120,34 +120,34 @@ void stream_free(struct stream *s) XFREE(MTYPE_STREAM, s); } -struct stream *stream_copy(struct stream *new, struct stream *src) +struct stream *stream_copy(struct stream *dest, const struct stream *src) { STREAM_VERIFY_SANE(src); - assert(new != NULL); - assert(STREAM_SIZE(new) >= src->endp); + assert(dest != NULL); + assert(STREAM_SIZE(dest) >= src->endp); - new->endp = src->endp; - new->getp = src->getp; + dest->endp = src->endp; + dest->getp = src->getp; - memcpy(new->data, src->data, src->endp); + memcpy(dest->data, src->data, src->endp); - return new; + return dest; } -struct stream *stream_dup(struct stream *s) +struct stream *stream_dup(const struct stream *s) { - struct stream *new; + struct stream *snew; STREAM_VERIFY_SANE(s); - if ((new = stream_new(s->endp)) == NULL) + if ((snew = stream_new(s->endp)) == NULL) return NULL; - return (stream_copy(new, s)); + return (stream_copy(snew, s)); } -struct stream *stream_dupcat(struct stream *s1, struct stream *s2, +struct stream *stream_dupcat(const struct stream *s1, const struct stream *s2, size_t offset) { struct stream *new; @@ -187,19 +187,19 @@ size_t stream_resize_inplace(struct stream **sptr, size_t newsize) return orig->size; } -size_t stream_get_getp(struct stream *s) +size_t stream_get_getp(const struct stream *s) { STREAM_VERIFY_SANE(s); return s->getp; } -size_t stream_get_endp(struct stream *s) +size_t stream_get_endp(const struct stream *s) { STREAM_VERIFY_SANE(s); return s->endp; } -size_t stream_get_size(struct stream *s) +size_t stream_get_size(const struct stream *s) { STREAM_VERIFY_SANE(s); return s->size; @@ -1133,11 +1133,17 @@ struct stream_fifo *stream_fifo_new(void) { struct stream_fifo *new; - new = XCALLOC(MTYPE_STREAM_FIFO, sizeof(struct stream_fifo)); - pthread_mutex_init(&new->mtx, NULL); + new = XMALLOC(MTYPE_STREAM_FIFO, sizeof(struct stream_fifo)); + stream_fifo_init(new); return new; } +void stream_fifo_init(struct stream_fifo *fifo) +{ + memset(fifo, 0, sizeof(struct stream_fifo)); + pthread_mutex_init(&fifo->mtx, NULL); +} + /* Add new stream to fifo. */ void stream_fifo_push(struct stream_fifo *fifo, struct stream *s) { @@ -1245,9 +1251,14 @@ size_t stream_fifo_count_safe(struct stream_fifo *fifo) return atomic_load_explicit(&fifo->count, memory_order_acquire); } -void stream_fifo_free(struct stream_fifo *fifo) +void stream_fifo_deinit(struct stream_fifo *fifo) { stream_fifo_clean(fifo); pthread_mutex_destroy(&fifo->mtx); +} + +void stream_fifo_free(struct stream_fifo *fifo) +{ + stream_fifo_deinit(fifo); XFREE(MTYPE_STREAM_FIFO, fifo); } diff --git a/lib/stream.h b/lib/stream.h index 23d83bf930..7cacf57d27 100644 --- a/lib/stream.h +++ b/lib/stream.h @@ -150,23 +150,25 @@ struct stream_fifo { */ extern struct stream *stream_new(size_t); extern void stream_free(struct stream *); -extern struct stream *stream_copy(struct stream *, struct stream *src); -extern struct stream *stream_dup(struct stream *); +/* Copy 'src' into 'dest', returns 'dest' */ +extern struct stream *stream_copy(struct stream *dest, + const struct stream *src); +extern struct stream *stream_dup(const struct stream *s); extern size_t stream_resize_inplace(struct stream **sptr, size_t newsize); -extern size_t stream_get_getp(struct stream *); -extern size_t stream_get_endp(struct stream *); -extern size_t stream_get_size(struct stream *); -extern uint8_t *stream_get_data(struct stream *); +extern size_t stream_get_getp(const struct stream *s); +extern size_t stream_get_endp(const struct stream *s); +extern size_t stream_get_size(const struct stream *s); +extern uint8_t *stream_get_data(struct stream *s); /** * Create a new stream structure; copy offset bytes from s1 to the new * stream; copy s2 data to the new stream; copy rest of s1 data to the * new stream. */ -extern struct stream *stream_dupcat(struct stream *s1, struct stream *s2, - size_t offset); +extern struct stream *stream_dupcat(const struct stream *s1, + const struct stream *s2, size_t offset); extern void stream_set_getp(struct stream *, size_t); extern void stream_set_endp(struct stream *, size_t); @@ -283,6 +285,18 @@ extern uint8_t *stream_pnt(struct stream *); extern struct stream_fifo *stream_fifo_new(void); /* + * Init or re-init an on-stack fifo. This allows use of a fifo struct without + * requiring a malloc/free cycle. + * Note well that the fifo must be de-inited with the 'fifo_deinit' api. + */ +void stream_fifo_init(struct stream_fifo *fifo); + +/* + * Deinit an on-stack fifo. + */ +void stream_fifo_deinit(struct stream_fifo *fifo); + +/* * Push a stream onto a stream_fifo. * * fifo |
