* 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>
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);
}
static void
rb_linebuf_free(buf_line_t * p)
{
-#ifndef NOBALLOC
rb_bh_free(rb_linebuf_heap, p);
-#else
- rb_free(p);
-#endif
}
/*
* 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);
{
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);
}
}
{
/* 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);
* 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;
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';
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--;
}
}
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;
/* 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';
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--;
}
bufline->len = len;
bufhead->len += len;
-
+
}
void
/* 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);
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';
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--;
}
}
ptr = bufhead->list.head;
-
+
bufline = ptr->data;
if(!bufline->terminated)
{
}
- 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
{
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)
{
{
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)
{
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);
*/
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
}