From de372ae2452684e5a9de1b41e5f14bcda0bbe8d9 Mon Sep 17 00:00:00 2001
From: Matthew Wild <mwild1@gmail.com>
Date: Thu, 4 Feb 2016 14:56:49 +0000
Subject: loggingmanager: Call setvbuf on output files, defaulting to
 line-buffered, instead of manually calling flush(). Adds 'buffer_mode' option
 to sink configuration for stdout, console and file sinks.

---
 core/loggingmanager.lua | 18 +++++++++++++++---
 1 file changed, 15 insertions(+), 3 deletions(-)

(limited to 'core')

diff --git a/core/loggingmanager.lua b/core/loggingmanager.lua
index 15d2ee3c..259c2c44 100644
--- a/core/loggingmanager.lua
+++ b/core/loggingmanager.lua
@@ -15,6 +15,7 @@ local math_max, rep = math.max, string.rep;
 local os_date = os.date;
 local getstyle, setstyle = require "util.termcolours".getstyle, require "util.termcolours".setstyle;
 
+-- COMPAT: This should no longer be needed since the addition of setvbuf calls
 if os.getenv("__FLUSH_LOG") then
 	local io_flush = io.flush;
 	local _io_write = io_write;
@@ -157,7 +158,6 @@ local function reload_logging()
 
 	logging_config = config.get("*", "log") or default_logging;
 
-
 	for name, sink_maker in pairs(old_sink_types) do
 		log_sink_types[name] = sink_maker;
 	end
@@ -185,6 +185,10 @@ function log_sink_types.stdout(sink_config)
 		timestamps = default_timestamp; -- Default format
 	end
 
+	if sink_config.buffer_mode ~= false then
+		io.stdout:setvbuf(sink_config.buffer_mode or "line");
+	end
+
 	return function (name, level, message, ...)
 		sourcewidth = math_max(#name+2, sourcewidth);
 		local namelen = #name;
@@ -220,6 +224,10 @@ do
 			timestamps = default_timestamp; -- Default format
 		end
 
+		if sink_config.buffer_mode ~= false then
+			io.stdout:setvbuf(sink_config.buffer_mode or "line");
+		end
+
 		return function (name, level, message, ...)
 			sourcewidth = math_max(#name+2, sourcewidth);
 			local namelen = #name;
@@ -247,7 +255,12 @@ function log_sink_types.file(sink_config)
 	if not logfile then
 		return empty_function;
 	end
-	local write, flush = logfile.write, logfile.flush;
+
+	if sink_config.buffer_mode ~= false then
+		logfile:setvbuf(sink_config.buffer_mode or "line");
+	end
+
+	local write = logfile.write;
 
 	local timestamps = sink_config.timestamps;
 
@@ -264,7 +277,6 @@ function log_sink_types.file(sink_config)
 		else
 			write(logfile, name, "\t" , level, "\t", message, "\n");
 		end
-		flush(logfile);
 	end;
 end
 
-- 
cgit v1.2.3