diff options
author | moneromooo-monero <moneromooo-monero@users.noreply.github.com> | 2015-05-30 19:24:15 +0100 |
---|---|---|
committer | moneromooo-monero <moneromooo-monero@users.noreply.github.com> | 2015-05-30 19:25:07 +0100 |
commit | 87c01c30f38941e567cdb934fe03c0b403475de9 (patch) | |
tree | 176c5ead833c913fb6c631517b186673bdefd170 /contrib/epee/include | |
parent | explicitly include libc++ with clang (diff) | |
download | monero-87c01c30f38941e567cdb934fe03c0b403475de9.tar.xz |
console_handler: handle EOF properly
Exit instead of reading "empty" commands in an infinite loop.
Diffstat (limited to 'contrib/epee/include')
-rw-r--r-- | contrib/epee/include/console_handler.h | 22 |
1 files changed, 19 insertions, 3 deletions
diff --git a/contrib/epee/include/console_handler.h b/contrib/epee/include/console_handler.h index fc8cc3841..256f272c2 100644 --- a/contrib/epee/include/console_handler.h +++ b/contrib/epee/include/console_handler.h @@ -58,6 +58,9 @@ namespace epee if (!start_read()) return false; + if (state_eos == m_read_status) + return false; + std::unique_lock<std::mutex> lock(m_response_mutex); while (state_init == m_read_status) { @@ -71,11 +74,14 @@ namespace epee res = true; } - m_read_status = state_init; + if (!eos()) + m_read_status = state_init; return res; } + bool eos() const { return m_read_status == state_eos; } + void stop() { if (m_run) @@ -167,7 +173,12 @@ namespace epee { read_ok = false; } - + if (std::cin.eof()) { + m_read_status = state_eos; + m_response_cv.notify_one(); + break; + } + else { std::unique_lock<std::mutex> lock(m_response_mutex); if (m_run.load(std::memory_order_relaxed)) @@ -189,7 +200,8 @@ namespace epee state_init, state_success, state_error, - state_cancelled + state_cancelled, + state_eos }; private: @@ -266,6 +278,10 @@ namespace epee { LOG_PRINT("Failed to read line.", LOG_LEVEL_0); } + if (m_stdin_reader.eos()) + { + break; + } string_tools::trim(command); LOG_PRINT_L2("Read command: " << command); |