[Tarantool-patches] [PATCH] clear terminal state on panic
Serge Petrenko
sergepetrenko at tarantool.org
Tue Nov 26 18:15:58 MSK 2019
The tarantool_free() call in the end of main() works all the time except
when we exit due to a panic. We need to clear terminal state in this
case also, so return to using atexit() to clear readline state.
Closes #4466
---
https://github.com/tarantool/tarantool/issues/4466
https://github.com/tarantool/tarantool/tree/sp/gh-4466-clear-rl-state
src/main.cc | 34 ++++++++++++++++++++++++----------
1 file changed, 24 insertions(+), 10 deletions(-)
diff --git a/src/main.cc b/src/main.cc
index 0ff2213b6..014958a17 100644
--- a/src/main.cc
+++ b/src/main.cc
@@ -588,6 +588,28 @@ load_cfg()
box_cfg();
}
+void
+free_rl_state(void)
+{
+ /* Same checks as in tarantool_free() */
+ if (getpid() != master_pid)
+ return;
+
+ if (!cord_is_main())
+ return;
+
+ /* tarantool_lua_free() was formerly reponsible for terminal reset,
+ * but it is no longer called
+ */
+ if (isatty(STDIN_FILENO)) {
+ /*
+ * Restore terminal state. Doesn't hurt if exiting not
+ * due to a signal.
+ */
+ rl_cleanup_after_signal();
+ }
+}
+
void
tarantool_free(void)
{
@@ -622,16 +644,6 @@ tarantool_free(void)
#ifdef ENABLE_GCOV
__gcov_flush();
#endif
- /* tarantool_lua_free() was formerly reponsible for terminal reset,
- * but it is no longer called
- */
- if (isatty(STDIN_FILENO)) {
- /*
- * Restore terminal state. Doesn't hurt if exiting not
- * due to a signal.
- */
- rl_cleanup_after_signal();
- }
cbus_free();
#if 0
/*
@@ -836,6 +848,8 @@ main(int argc, char **argv)
trigger_create(&break_loop_trigger, break_loop, NULL, NULL);
trigger_add(&box_on_shutdown, &break_loop_trigger);
+ atexit(free_rl_state);
+
if (!loop())
panic("%s", "can't init event loop");
--
2.21.0 (Apple Git-122)
More information about the Tarantool-patches
mailing list