add option: flush stdout

Added the option to forcefully flush STDOUT, which may be useful when running the miner through a pipe instead than a shell.
If STDOUT is a shell, it's unbuffered by default.
If STDOUT is a pipe, it's buffered by default.
This commit is contained in:
Alessandro Da Rugna
2017-10-29 21:05:57 +01:00
committed by psychocrypt
parent a7fb89bec2
commit cb3fc22ac1
4 changed files with 28 additions and 1 deletions
+8
View File
@@ -139,6 +139,14 @@ R"===(
*/
"daemon_mode" : false,
/*
* Buffered output control.
* When running the miner through a pipe, standard output is buffered. This means that the pipe won't read
* each output line immediately. This can cause delays when running in background.
* Set this option to true to flush stdout after each line, so it can be read immediately.
*/
"flush_stdout" : false,
/*
* Output file
*
+12 -1
View File
@@ -48,7 +48,7 @@ using namespace rapidjson;
*/
enum configEnum {
bTlsMode, bTlsSecureAlgo, sTlsFingerprint, sPoolAddr, sWalletAddr, sPoolPwd,sCurrency,
iCallTimeout, iNetRetry, iGiveUpLimit, iVerboseLevel, iAutohashTime,
iCallTimeout, iNetRetry, iGiveUpLimit, iVerboseLevel, iAutohashTime,bFlushStdout,
bDaemonMode, sOutputFile, iHttpdPort, bPreferIpv4, bNiceHashMode, bAesOverride, sUseSlowMem };
struct configVal {
@@ -72,6 +72,7 @@ configVal oConfigValues[] = {
{ iGiveUpLimit, "giveup_limit", kNumberType },
{ iVerboseLevel, "verbose_level", kNumberType },
{ iAutohashTime, "h_print_time", kNumberType },
{ bFlushStdout, "flush_stdout", kTrueType},
{ bDaemonMode, "daemon_mode", kTrueType },
{ sOutputFile, "output_file", kStringType },
{ iHttpdPort, "httpd_port", kNumberType },
@@ -448,5 +449,15 @@ bool jconf::parse_config(const char* sFilename)
}
#endif // _WIN32
if (prv->configValues[bFlushStdout]->IsBool())
{
bool bflush = prv->configValues[bFlushStdout]->GetBool();
printer::inst()->set_flush_stdout(bflush);
if (bflush)
{
printer::inst()->print_msg(L0, "Flush stdout forced.");
}
}
return true;
}
+6
View File
@@ -156,6 +156,7 @@ printer::printer()
{
verbose_level = LINF;
logfile = nullptr;
b_flush_stdout = false;
}
bool printer::open_logfile(const char* file)
@@ -193,6 +194,11 @@ void printer::print_msg(verbosity verbose, const char* fmt, ...)
std::unique_lock<std::mutex> lck(print_mutex);
fputs(buf, stdout);
if (b_flush_stdout)
{
fflush(stdout);
}
if(logfile != nullptr)
{
fputs(buf, logfile);
+2
View File
@@ -35,6 +35,7 @@ public:
};
inline void set_verbose_level(size_t level) { verbose_level = (verbosity)level; }
inline void set_flush_stdout(bool status) { b_flush_stdout = status; }
void print_msg(verbosity verbose, const char* fmt, ...);
void print_str(const char* str);
bool open_logfile(const char* file);
@@ -44,6 +45,7 @@ private:
std::mutex print_mutex;
verbosity verbose_level;
bool b_flush_stdout;
FILE* logfile;
};