X-Git-Url: https://jfr.im/git/irc/rqf/shadowircd.git/blobdiff_plain/b57f37fb6a4d30ac9aaba3bbca06f5a3307c804a..36fb4e9a7743326d1a2ca7601bc9bf1c5b9a0bcb:/libratbox/src/linebuf.c diff --git a/libratbox/src/linebuf.c b/libratbox/src/linebuf.c index 613e3b2..b3d2bb9 100644 --- a/libratbox/src/linebuf.c +++ b/libratbox/src/linebuf.c @@ -21,16 +21,14 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 * USA * - * $Id: linebuf.c 25038 2008-01-23 16:03:08Z androsyn $ + * $Id: linebuf.c 26092 2008-09-19 15:13:52Z androsyn $ */ #include #include #include -#ifndef NOBALLOC static rb_bh *rb_linebuf_heap; -#endif static int bufline_count = 0; @@ -47,20 +45,14 @@ static int bufline_count = 0; void rb_linebuf_init(size_t heap_size) { -#ifndef NOBALLOC rb_linebuf_heap = rb_bh_create(sizeof(buf_line_t), heap_size, "librb_linebuf_heap"); -#endif } static buf_line_t * rb_linebuf_allocate(void) { buf_line_t *t; -#ifndef NOBALLOC t = rb_bh_alloc(rb_linebuf_heap); -#else - t = rb_malloc(sizeof(buf_line_t)); -#endif return (t); } @@ -68,11 +60,7 @@ rb_linebuf_allocate(void) static void rb_linebuf_free(buf_line_t * p) { -#ifndef NOBALLOC rb_bh_free(rb_linebuf_heap, p); -#else - rb_free(p); -#endif } /* @@ -113,7 +101,7 @@ rb_linebuf_new_line(buf_head_t * bufhead) * We've finished with the given line, so deallocate it */ static void -rb_linebuf_done_line(buf_head_t * bufhead, buf_line_t * bufline, rb_dlink_node * node) +rb_linebuf_done_line(buf_head_t * bufhead, buf_line_t * bufline, rb_dlink_node *node) { /* Remove it from the linked list */ rb_dlinkDestroy(node, &bufhead->list); @@ -188,7 +176,8 @@ rb_linebuf_donebuf(buf_head_t * bufhead) { while(bufhead->list.head != NULL) { - rb_linebuf_done_line(bufhead, (buf_line_t *) bufhead->list.head->data, bufhead->list.head); + rb_linebuf_done_line(bufhead, (buf_line_t *) bufhead->list.head->data, + bufhead->list.head); } } @@ -368,7 +357,6 @@ rb_linebuf_parse(buf_head_t * bufhead, char *data, int len, int raw) { /* Check we're doing the partial buffer thing */ bufline = bufhead->list.tail->data; - lrb_assert(!bufline->flushing); /* just try, the worst it could do is *reject* us .. */ if(!raw) cpylen = rb_linebuf_copy_line(bufhead, bufline, data, len); @@ -516,7 +504,8 @@ rb_linebuf_attach(buf_head_t * bufhead, buf_head_t * new) * Then format/va_args is appended to the buffer. */ void -rb_linebuf_putmsg(buf_head_t * bufhead, const char *format, va_list * va_args, const char *prefixfmt, ...) +rb_linebuf_putmsg(buf_head_t * bufhead, const char *format, va_list * va_args, + const char *prefixfmt, ...) { buf_line_t *bufline; int len = 0; @@ -548,13 +537,13 @@ rb_linebuf_putmsg(buf_head_t * bufhead, const char *format, va_list * va_args, c bufline->terminated = 1; /* Truncate the data if required */ - if(unlikely(len > 510)) + if(rb_unlikely(len > 510)) { len = 510; bufline->buf[len++] = '\r'; bufline->buf[len++] = '\n'; } - else if(unlikely(len == 0)) + else if(rb_unlikely(len == 0)) { bufline->buf[len++] = '\r'; bufline->buf[len++] = '\n'; @@ -563,7 +552,8 @@ rb_linebuf_putmsg(buf_head_t * bufhead, const char *format, va_list * va_args, c else { /* Chop trailing CRLF's .. */ - while((bufline->buf[len] == '\r') || (bufline->buf[len] == '\n') || (bufline->buf[len] == '\0')) + while((bufline->buf[len] == '\r') || (bufline->buf[len] == '\n') + || (bufline->buf[len] == '\0')) { len--; } @@ -578,7 +568,7 @@ rb_linebuf_putmsg(buf_head_t * bufhead, const char *format, va_list * va_args, c } void -rb_linebuf_putbuf(buf_head_t *bufhead, const char *buffer) +rb_linebuf_putbuf(buf_head_t * bufhead, const char *buffer) { buf_line_t *bufline; int len = 0; @@ -594,19 +584,19 @@ rb_linebuf_putbuf(buf_head_t *bufhead, const char *buffer) /* Create a new line */ bufline = rb_linebuf_new_line(bufhead); - if(unlikely(buffer != NULL)) + if(rb_unlikely(buffer != NULL)) len = rb_strlcpy(bufline->buf, buffer, BUF_DATA_SIZE); bufline->terminated = 1; /* Truncate the data if required */ - if(unlikely(len > 510)) + if(rb_unlikely(len > 510)) { len = 510; bufline->buf[len++] = '\r'; bufline->buf[len++] = '\n'; } - else if(unlikely(len == 0)) + else if(rb_unlikely(len == 0)) { bufline->buf[len++] = '\r'; bufline->buf[len++] = '\n'; @@ -615,7 +605,8 @@ rb_linebuf_putbuf(buf_head_t *bufhead, const char *buffer) else { /* Chop trailing CRLF's .. */ - while((bufline->buf[len] == '\r') || (bufline->buf[len] == '\n') || (bufline->buf[len] == '\0')) + while((bufline->buf[len] == '\r') || (bufline->buf[len] == '\n') + || (bufline->buf[len] == '\0')) { len--; } @@ -628,7 +619,7 @@ rb_linebuf_putbuf(buf_head_t *bufhead, const char *buffer) bufline->len = len; bufhead->len += len; - + } void @@ -649,7 +640,7 @@ rb_linebuf_put(buf_head_t * bufhead, const char *format, ...) /* Create a new line */ bufline = rb_linebuf_new_line(bufhead); - if(unlikely(format != NULL)) + if(rb_unlikely(format != NULL)) { va_start(args, format); len = rb_vsnprintf(bufline->buf, BUF_DATA_SIZE, format, args); @@ -659,13 +650,13 @@ rb_linebuf_put(buf_head_t * bufhead, const char *format, ...) bufline->terminated = 1; /* Truncate the data if required */ - if(unlikely(len > 510)) + if(rb_unlikely(len > 510)) { len = 510; bufline->buf[len++] = '\r'; bufline->buf[len++] = '\n'; } - else if(unlikely(len == 0)) + else if(rb_unlikely(len == 0)) { bufline->buf[len++] = '\r'; bufline->buf[len++] = '\n'; @@ -674,7 +665,8 @@ rb_linebuf_put(buf_head_t * bufhead, const char *format, ...) else { /* Chop trailing CRLF's .. */ - while((bufline->buf[len] == '\r') || (bufline->buf[len] == '\n') || (bufline->buf[len] == '\0')) + while((bufline->buf[len] == '\r') || (bufline->buf[len] == '\n') + || (bufline->buf[len] == '\0')) { len--; } @@ -730,7 +722,7 @@ rb_linebuf_flush(rb_fde_t *F, buf_head_t * bufhead) } ptr = bufhead->list.head; - + bufline = ptr->data; if(!bufline->terminated) { @@ -739,12 +731,9 @@ rb_linebuf_flush(rb_fde_t *F, buf_head_t * bufhead) } - if(bufline->flushing) - { - vec[x].iov_base = bufline->buf + bufhead->writeofs; - vec[x++].iov_len = bufline->len - bufhead->writeofs; - ptr = ptr->next; - } + vec[x].iov_base = bufline->buf + bufhead->writeofs; + vec[x++].iov_len = bufline->len - bufhead->writeofs; + ptr = ptr->next; do { @@ -754,12 +743,13 @@ rb_linebuf_flush(rb_fde_t *F, buf_head_t * bufhead) bufline = ptr->data; if(!bufline->terminated) break; - + vec[x].iov_base = bufline->buf; vec[x].iov_len = bufline->len; ptr = ptr->next; - } while(++x < RB_UIO_MAXIOV); + } + while(++x < RB_UIO_MAXIOV); if(x == 0) { @@ -777,37 +767,26 @@ rb_linebuf_flush(rb_fde_t *F, buf_head_t * bufhead) { bufline = ptr->data; - if(bufline->flushing) - { - if(xret >= bufline->len - bufhead->writeofs) - { - xret = xret - (bufline->len - bufhead->writeofs); - ptr = ptr->next; - rb_linebuf_done_line(bufhead, bufline, bufhead->list.head); - continue; - } - } - if(xret >= bufline->len) + if(xret >= bufline->len - bufhead->writeofs) { - xret = xret - bufline->len; + xret -= bufline->len - bufhead->writeofs; ptr = ptr->next; rb_linebuf_done_line(bufhead, bufline, bufhead->list.head); + bufhead->writeofs = 0; } - else + else { - bufline->flushing = 1; - bufhead->writeofs = xret; + bufhead->writeofs += xret; break; } - } return retval; } -#endif +#endif + + /* this is the non-writev case */ - /* this is the non-writev case */ - /* Check we actually have a first buffer */ if(bufhead->list.head == NULL) { @@ -825,13 +804,6 @@ rb_linebuf_flush(rb_fde_t *F, buf_head_t * bufhead) return -1; } - /* Check we're flushing the first buffer */ - if(!bufline->flushing) - { - bufline->flushing = 1; - bufhead->writeofs = 0; - } - /* Now, try writing data */ retval = rb_write(F, bufline->buf + bufhead->writeofs, bufline->len - bufhead->writeofs); @@ -861,12 +833,7 @@ rb_linebuf_flush(rb_fde_t *F, buf_head_t * bufhead) */ void -rb_count_rb_linebuf_memory(size_t * count, size_t * rb_linebuf_memory_used) +rb_count_rb_linebuf_memory(size_t *count, size_t *rb_linebuf_memory_used) { -#ifndef NOBALLOC rb_bh_usage(rb_linebuf_heap, count, NULL, rb_linebuf_memory_used, NULL); -#else - *count = 0; - *rb_linebuf_memory_used = 0; -#endif }