[pve-devel] [PATCH mini-journalreader v2 4/5] use fwrite_unlocked instead of manually printing to buffer

Dominik Csapak d.csapak at proxmox.com
Thu May 16 12:22:18 CEST 2019


this does the same as our old code, but is a lot shorter,
so it was uneccessary to have and the performance is the same
(no measureable difference)

we still need a wrapper to be sure that we wrote everything

Signed-off-by: Dominik Csapak <d.csapak at proxmox.com>
---
 src/mini-journalreader.c | 34 ++++++++++++++--------------------
 1 file changed, 14 insertions(+), 20 deletions(-)

diff --git a/src/mini-journalreader.c b/src/mini-journalreader.c
index 1586592..3be348e 100644
--- a/src/mini-journalreader.c
+++ b/src/mini-journalreader.c
@@ -29,10 +29,9 @@
 #include <time.h>
 #include <unistd.h>
 
-#define BUFSIZE 4095
+#define BUFSIZE 4096
 
-static char buf[BUFSIZE + 1];
-static size_t offset = 0;
+static char BUF[BUFSIZE];
 
 static uint64_t get_timestamp(sd_journal *j) {
     uint64_t timestamp;
@@ -48,20 +47,12 @@ static void print_to_buf(const char * string, size_t length) {
     if (!length) {
         return;
     }
-    size_t string_offset = 0;
-    size_t remaining = length;
-    while (offset + remaining > BUFSIZE) {
-        strncpy(buf + offset, string + string_offset, BUFSIZE - offset);
-        string_offset += BUFSIZE - offset;
-        remaining = length - string_offset;
-        if (write (1, buf, BUFSIZE) <= 0) {
-            perror("write to stdout failed");
-            exit(1);
-        }
-        offset = 0;
+
+    size_t r = fwrite_unlocked(string, 1, length, stdout);
+    if (r < length) {
+	fprintf(stderr, "Failed to write\n");
+	exit(1);
     }
-    strncpy(buf + offset, string + string_offset, remaining);
-    offset += remaining;
 }
 
 static void print_cursor(sd_journal *j) {
@@ -272,6 +263,12 @@ int main(int argc, char *argv[]) {
         usage("unkown, or to many arguments");
     }
 
+    // setup stdout buffer
+    if (setvbuf(stdout, BUF, _IOFBF, BUFSIZE)) {
+	fprintf(stderr, "Failed to set buffer for stdout: %s\n", strerror(errno));
+	return 1;
+    }
+
     // to prevent calling it everytime we generate a timestamp
     tzset();
 
@@ -354,10 +351,7 @@ int main(int argc, char *argv[]) {
     sd_journal_close(j);
 
     // print remaining buffer
-    if (write (1, buf, offset) <= 0) {
-        perror("write to stdout failed");
-        return 1;
-    }
+    fflush_unlocked(stdout);
 
     return 0;
 }
-- 
2.11.0





More information about the pve-devel mailing list