]> jfr.im git - irc/rqf/shadowircd.git/blobdiff - libratbox/src/linebuf.c
Update FAQ.
[irc/rqf/shadowircd.git] / libratbox / src / linebuf.c
index 613e3b29225bc2ac3de90ce7010d4f63e00bffa4..b3d2bb9d2c8cde044ac14f4c337d5cbf2040a8da 100644 (file)
  *  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 <libratbox_config.h>
 #include <ratbox_lib.h>
 #include <commio-int.h>
 
-#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
 }