From: Jeff Peeler Date: Fri, 8 Oct 2010 02:45:44 +0000 (+0000) Subject: Merged revisions 290862 via svnmerge from X-Git-Tag: 1.6.2.15-rc1~51 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=588318f9a68b0d893a8a95661fe05fe3ac7d2fc5;p=thirdparty%2Fasterisk.git Merged revisions 290862 via svnmerge from https://origsvn.digium.com/svn/asterisk/branches/1.4 ........ r290862 | jpeeler | 2010-10-07 21:35:29 -0500 (Thu, 07 Oct 2010) | 9 lines Ensure editline cleanup occurs when Ctrl-C is pressed at control console. A recent change was made to avoid a race condition on shutdown which only called the end functions from the console thread. However, when pressing Ctrl-C the quit handler is called from the signal handler thread. (closes issue #17698) Reported by: jmls ........ git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.6.2@290863 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- diff --git a/main/asterisk.c b/main/asterisk.c index a4539d13cb..d89e8606db 100644 --- a/main/asterisk.c +++ b/main/asterisk.c @@ -275,6 +275,7 @@ static char *_argv[256]; static int shuttingdown; static int restartnow; static pthread_t consolethread = AST_PTHREADT_NULL; +static pthread_t mon_sig_flags; static int canary_pid = 0; static char canary_filename[128]; @@ -1628,14 +1629,15 @@ static void quit_handler(int num, int niceness, int safeshutdown, int restart) ast_module_shutdown(); } if (ast_opt_console || (ast_opt_remote && !ast_opt_exec)) { + pthread_t thisthread = pthread_self(); if (getenv("HOME")) { snprintf(filename, sizeof(filename), "%s/.asterisk_history", getenv("HOME")); } if (!ast_strlen_zero(filename)) { ast_el_write_history(filename); } - if (consolethread == AST_PTHREADT_NULL || consolethread == pthread_self()) { - /* Only end if we are the consolethread, otherwise there's a race with that thread. */ + if (consolethread == AST_PTHREADT_NULL || consolethread == thisthread || mon_sig_flags == thisthread) { + /* Only end if we are the consolethread or signal handler, otherwise there's a race with that thread. */ if (el != NULL) { el_end(el); } @@ -3786,9 +3788,8 @@ int main(int argc, char *argv[]) /* Console stuff now... */ /* Register our quit function */ char title[256]; - pthread_t dont_care; - ast_pthread_create_detached(&dont_care, NULL, monitor_sig_flags, NULL); + ast_pthread_create_detached(&mon_sig_flags, NULL, monitor_sig_flags, NULL); set_icon("Asterisk"); snprintf(title, sizeof(title), "Asterisk Console on '%s' (pid %ld)", hostname, (long)ast_mainpid);