]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
shared: leave output_journal() output in buffer (#6304)
authorVito Caputo <vcaputo@gnugeneration.com>
Fri, 7 Jul 2017 18:32:21 +0000 (11:32 -0700)
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Fri, 7 Jul 2017 18:32:21 +0000 (14:32 -0400)
e268b81e moved an fflush() from output_json() to the generic
output_journal(), when it probably should have deleted all fflush()
calls from logs-show.c altogether.

The caller supplies the FILE * to these functions, and should be in
charge of flushing as needed.  The current implementation essentially
defeats any buffering stdio was bringing to the table, resulting in
extraneous tiny write() calls in commands like `journalctl -b`.

This commit removes the fflush() call from output_journal(), and adds
them to journalctl before waiting for more entries and at completion.
This way in the hot path when journalctl loops on entries stdio can
combine multiple entries into bulkier write() calls.

src/journal/journalctl.c
src/shared/logs-show.c

index 698a5a9dc85f273a2981a030fcc024f39cab7035..2313c8c6786dceb17153e284f5751bc7374c2cdd 100644 (file)
@@ -2483,6 +2483,7 @@ int main(int argc, char *argv[]) {
                         break;
                 }
 
+                fflush(stdout);
                 r = sd_journal_wait(j, (uint64_t) -1);
                 if (r < 0) {
                         log_error_errno(r, "Couldn't wait for journal event: %m");
@@ -2493,6 +2494,7 @@ int main(int argc, char *argv[]) {
         }
 
 finish:
+        fflush(stdout);
         pager_close();
 
         strv_free(arg_file);
index c735fa159d921f5778c5e2c74cbd45ebe01fe79a..02ae4265c6b5ef0b67b02e89c2ec875d278db268 100644 (file)
@@ -991,7 +991,6 @@ int output_journal(
                 n_columns = columns();
 
         ret = output_funcs[mode](f, j, mode, n_columns, flags);
-        fflush(stdout);
 
         if (ellipsized && ret > 0)
                 *ellipsized = true;