From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from smtp55.i.mail.ru (smtp55.i.mail.ru [217.69.128.35]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dev.tarantool.org (Postfix) with ESMTPS id DF5D146970F for ; Tue, 26 Nov 2019 18:16:33 +0300 (MSK) From: Serge Petrenko Date: Tue, 26 Nov 2019 18:15:58 +0300 Message-Id: <20191126151557.25754-1-sergepetrenko@tarantool.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Subject: [Tarantool-patches] [PATCH] clear terminal state on panic List-Id: Tarantool development patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: alexander.turenko@tarantool.org Cc: tarantool-patches@dev.tarantool.org 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)