From eeafc1a05743d1f3c899f1291e818f8e2b236e52 Mon Sep 17 00:00:00 2001 From: Denis Vlasenko Date: Sat, 27 Jan 2007 23:15:50 +0000 Subject: [PATCH] svlogd: batch writes if !timestamp --- runit/svlogd.c | 48 +++++++++++++++++++++++++++++------------------- 1 file changed, 29 insertions(+), 19 deletions(-) diff --git a/runit/svlogd.c b/runit/svlogd.c index a588ffeb0..cf29e8e9f 100644 --- a/runit/svlogd.c +++ b/runit/svlogd.c @@ -55,7 +55,7 @@ static const char *replace = ""; static char repl; static struct logdir { - ////char *btmp; +//// char *btmp; /* pattern list to match, in "aa\0bb\0\cc\0\0" form */ char *inst; char *processor; @@ -732,6 +732,7 @@ int svlogd_main(int argc, char **argv) int i; unsigned opt; unsigned timestamp = 0; + void* (*memRchr)(const void *, int, size_t) = memchr; #define line bb_common_bufsiz1 @@ -748,10 +749,10 @@ int svlogd_main(int argc, char **argv) if (linemax == 0) linemax = BUFSIZ-26; if (linemax < 256) linemax = 256; } - if (opt & 8) { // -b - ////buflen = xatoi_u(b); - ////if (buflen == 0) buflen = 1024; - } +//// if (opt & 8) { // -b +//// buflen = xatoi_u(b); +//// if (buflen == 0) buflen = 1024; +//// } //if (opt & 0x10) timestamp++; // -t //if (opt & 0x20) verbose++; // -v //if (timestamp > 2) timestamp = 2; @@ -789,7 +790,13 @@ int svlogd_main(int argc, char **argv) logdirs_reopen(); - /* Each iteration processes one line */ + /* Without timestamps, we don't have to print each line + * separately, so we can look for _last_ newline, not first, + * thus batching writes */ + if (!timestamp) + memRchr = memrchr; + + /* Each iteration processes one line or more lines */ while (1) { char stamp[FMT_PTIME]; char *lineptr; @@ -817,15 +824,17 @@ int svlogd_main(int argc, char **argv) /* (possibly has some unprocessed data from prev loop) */ /* Refill the buffer if needed */ - np = memchr(lineptr, '\n', stdin_cnt); - i = linemax - stdin_cnt; /* avail. bytes at tail */ - if (i >= 128 && !exitasap && !np) { - int sz = buffer_pread(0, lineptr + stdin_cnt, i); - if (sz <= 0) /* EOF or error on stdin */ - exitasap = 1; - else { - np = memchr(lineptr + stdin_cnt, '\n', sz); - stdin_cnt += sz; + np = memRchr(lineptr, '\n', stdin_cnt); + if (!np && !exitasap) { + i = linemax - stdin_cnt; /* avail. bytes at tail */ + if (i >= 128) { + i = buffer_pread(0, lineptr + stdin_cnt, i); + if (i <= 0) /* EOF or error on stdin */ + exitasap = 1; + else { + np = memRchr(lineptr + stdin_cnt, '\n', i); + stdin_cnt += i; + } } } if (stdin_cnt <= 0 && exitasap) @@ -874,8 +883,9 @@ int svlogd_main(int argc, char **argv) stdin_cnt = 1; } else { linelen = stdin_cnt; - np = memchr(lineptr, '\n', stdin_cnt); - if (np) linelen = np - lineptr + 1; + np = memRchr(lineptr, '\n', stdin_cnt); + if (np) + linelen = np - lineptr + 1; ch = lineptr[linelen-1]; } /* linelen == no of chars incl. '\n' (or == stdin_cnt) */ @@ -893,7 +903,7 @@ int svlogd_main(int argc, char **argv) lineptr += linelen; /* If we see another '\n', we don't need to read * next piece of input: can print what we have */ - np = memchr(lineptr, '\n', stdin_cnt); + np = memRchr(lineptr, '\n', stdin_cnt); if (np) goto print_to_nl; /* Move unprocessed data to the front of line */ @@ -907,5 +917,5 @@ int svlogd_main(int argc, char **argv) /* repeat */; logdir_close(&dir[i]); } - _exit(0); + return 0; }