svlogd: batch writes if !timestamp
authorDenis Vlasenko <vda.linux@googlemail.com>
Sat, 27 Jan 2007 23:15:50 +0000 (23:15 -0000)
committerDenis Vlasenko <vda.linux@googlemail.com>
Sat, 27 Jan 2007 23:15:50 +0000 (23:15 -0000)
runit/svlogd.c

index a588ffe..cf29e8e 100644 (file)
@@ -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;
 }