From 9cd9ab436d732662cd3145304388f70253f67f1d Mon Sep 17 00:00:00 2001 From: Jianhui Zhao Date: Mon, 8 Oct 2018 22:10:05 +0800 Subject: [PATCH] Update buffer from 'github/zhaojh329/buffer' Signed-off-by: Jianhui Zhao --- src/buffer.c | 6 +++++- src/buffer.h | 23 ++++++++++++++++++++++- 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/src/buffer.c b/src/buffer.c index c52df68..8684c0b 100644 --- a/src/buffer.c +++ b/src/buffer.c @@ -23,7 +23,6 @@ #include #include -#include #include #include #include @@ -109,6 +108,7 @@ void *buffer_put(struct buffer *b, size_t len) tmp = b->tail; b->tail += len; + return tmp; } @@ -230,6 +230,8 @@ size_t buffer_pull(struct buffer *b, void *dest, size_t len) b->data += len; + buffer_check_persistent_size(b); + return len; } @@ -283,6 +285,8 @@ int buffer_pull_to_fd(struct buffer *b, int fd, size_t len, b->data += ret; } while (remain); + buffer_check_persistent_size(b); + return len - remain; } diff --git a/src/buffer.h b/src/buffer.h index fc74992..0d0dd08 100644 --- a/src/buffer.h +++ b/src/buffer.h @@ -23,6 +23,7 @@ #include #include #include +#include #include #include @@ -46,6 +47,7 @@ enum { }; struct buffer { + size_t persistent; /* persistent size */ uint8_t *head; /* Head of buffer */ uint8_t *data; /* Data head pointer */ uint8_t *tail; /* Data tail pointer */ @@ -84,6 +86,23 @@ static inline void *buffer_data(const struct buffer *b) return b->data; } +static inline void buffer_set_persistent_size(struct buffer *b, size_t size) +{ + size_t new_size = getpagesize(); + + while (new_size < size) + new_size <<= 1; + + b->persistent = new_size; +} + +static inline void buffer_check_persistent_size(struct buffer *b) +{ + if (b->persistent > 0 && + buffer_size(b) > b->persistent && buffer_length(b) < b->persistent) + buffer_resize(b, b->persistent); +} + void *buffer_put(struct buffer *b, size_t len); static inline void *buffer_put_zero(struct buffer *b, size_t len) @@ -182,8 +201,10 @@ int buffer_put_fd(struct buffer *b, int fd, ssize_t len, bool *eof, */ static inline void buffer_truncate(struct buffer *b, size_t len) { - if (buffer_length(b) > len) + if (buffer_length(b) > len) { b->tail = b->data + len; + buffer_check_persistent_size(b); + } }