diff options
author | moneromooo-monero <moneromooo-monero@users.noreply.github.com> | 2015-12-06 22:03:53 +0000 |
---|---|---|
committer | moneromooo-monero <moneromooo-monero@users.noreply.github.com> | 2015-12-06 22:03:53 +0000 |
commit | 4cede1830e02966cf0a51f0425b7cf8a2bf13bce (patch) | |
tree | e8dec4142533d32386c36188ebeb742c88aaa618 | |
parent | Merge pull request #518 (diff) | |
download | monero-4cede1830e02966cf0a51f0425b7cf8a2bf13bce.tar.xz |
console_handler: catch exception inside the input loop
This prevents an exception from existing the loop without
calling the exit handler, if one is defined.
The daemon defines one, which stops the p2p layer, and will
only exit once the p2p layer is shut down. This would cause
a hang upon an exception, as the input thread would have
exited and the daemon would wait forever with no console
user input.
-rw-r--r-- | contrib/epee/include/console_handler.h | 69 |
1 files changed, 37 insertions, 32 deletions
diff --git a/contrib/epee/include/console_handler.h b/contrib/epee/include/console_handler.h index c6e7c857d..685f0cc7b 100644 --- a/contrib/epee/include/console_handler.h +++ b/contrib/epee/include/console_handler.h @@ -268,52 +268,57 @@ namespace epee template<typename t_cmd_handler> bool run(const std::string& prompt, const std::string& usage, const t_cmd_handler& cmd_handler, std::function<void(void)> exit_handler) { - TRY_ENTRY(); bool continue_handle = true; m_prompt = prompt; while(continue_handle) { - if (!m_running) + try { - break; - } - print_prompt(); + if (!m_running) + { + break; + } + print_prompt(); - std::string command; - bool get_line_ret = m_stdin_reader.get_line(command); - if (!m_running || m_stdin_reader.eos()) - { - break; - } - if (!get_line_ret) - { - LOG_PRINT("Failed to read line.", LOG_LEVEL_0); - } - string_tools::trim(command); + std::string command; + bool get_line_ret = m_stdin_reader.get_line(command); + if (!m_running || m_stdin_reader.eos()) + { + break; + } + if (!get_line_ret) + { + LOG_PRINT("Failed to read line.", LOG_LEVEL_0); + } + string_tools::trim(command); - LOG_PRINT_L2("Read command: " << command); - if (command.empty()) - { - continue; - } - else if(cmd_handler(command)) - { - continue; - } - else if(0 == command.compare("exit") || 0 == command.compare("q")) - { - continue_handle = false; + LOG_PRINT_L2("Read command: " << command); + if (command.empty()) + { + continue; + } + else if(cmd_handler(command)) + { + continue; + } + else if(0 == command.compare("exit") || 0 == command.compare("q")) + { + continue_handle = false; + } + else + { + std::cout << "unknown command: " << command << std::endl; + std::cout << usage; + } } - else + catch (const std::exception &ex) { - std::cout << "unknown command: " << command << std::endl; - std::cout << usage; + LOG_ERROR("Exception at [console_handler], what=" << ex.what()); } } if (exit_handler) exit_handler(); return true; - CATCH_ENTRY_L0("console_handler", false); } private: |