int head;
int tail;
int not_empty;
- int buffered_len;
char buffer[0];
};
struct writer* writers;
struct reader** readers;
struct log_buffer** buffers;
+ int buffered_len;
int max_buffered_bytes;
int max_buffered_time;
log_format* default_format;
return free_space;
}
-static void buffer_append(const struct logger_entry* entry, struct log_buffer* b, struct reader* reader_head)
+static void buffer_append(struct logger* s, const struct logger_entry* entry, struct log_buffer* b, struct reader* reader_head)
{
while (buffer_free_space(b) <= entry->len) { // note that we use <= instead of < to make sure there's always some extra empty space. This guarantees that head != tail, which serves to disambiguate readers living there
int old_head = b->head;
copy_to_buffer(entry, b->tail, entry->len, b);
b->tail += entry->len;
b->tail %= b->size;
- b->buffered_len += entry->len;
+ s->buffered_len += entry->len;
b->not_empty = 1;
++b->lines;
}
return EINVAL;
wr->buf_ptr->head = wr->buf_ptr->tail = wr->buf_ptr->not_empty = 0;
- wr->buf_ptr->buffered_len = wr->buf_ptr->lines = 0;
+ wr->buf_ptr->lines = 0;
LIST_FOREACH(server->readers[wr->buf_ptr->id], reader) {
reader->current = 0;
while ((wr->readed >= sizeof(entry->len)) && (entry->len <= wr->readed)) {
if (entry->len < sizeof(struct logger_entry))
return EINVAL;
- buffer_append(entry, server->buffers[wr->buf_ptr->id], server->readers[wr->buf_ptr->id]);
+ buffer_append(server, entry, server->buffers[wr->buf_ptr->id], server->readers[wr->buf_ptr->id]);
wr->readed -= entry->len;
memmove(wr->buffer, wr->buffer + entry->len, LOG_MAX_SIZE - entry->len);
}
{
int i = 0;
int r = 0;
- struct log_buffer** buffers = server->buffers;
struct reader* reader = NULL;
- for (i = 0; i < LOG_ID_MAX; i++) {
- if (force_push || buffers[i]->buffered_len >= server->max_buffered_bytes) {
+ if (force_push || server->buffered_len >= server->max_buffered_bytes) {
+ for (i = 0; i < LOG_ID_MAX; i++) {
LIST_FOREACH(server->readers[i], reader) {
r = service_reader(server, reader);
if (r > 0) {
break;
}
}
-
- buffers[i]->buffered_len = 0;
}
+ server->buffered_len = 0;
}
}