[asterisk-commits] jpeeler: branch 1.4 r290862 - /branches/1.4/main/asterisk.c

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Thu Oct 7 21:35:34 CDT 2010


Author: jpeeler
Date: Thu Oct  7 21:35:29 2010
New Revision: 290862

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=290862
Log:
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

Modified:
    branches/1.4/main/asterisk.c

Modified: branches/1.4/main/asterisk.c
URL: http://svnview.digium.com/svn/asterisk/branches/1.4/main/asterisk.c?view=diff&rev=290862&r1=290861&r2=290862
==============================================================================
--- branches/1.4/main/asterisk.c (original)
+++ branches/1.4/main/asterisk.c Thu Oct  7 21:35:29 2010
@@ -245,6 +245,7 @@
 static int shuttingdown;
 static int restartnow;
 static pthread_t consolethread = AST_PTHREADT_NULL;
+static pthread_t mon_sig_flags;
 
 static char randompool[256];
 
@@ -1321,14 +1322,15 @@
 			ast_module_shutdown();
 	}
 	if (ast_opt_console || ast_opt_remote) {
+		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);
 			}
@@ -3290,11 +3292,10 @@
 		/* Register our quit function */
 		char title[256];
 		pthread_attr_t attr;
-		pthread_t dont_care;
 
 		pthread_attr_init(&attr);
 		pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
-		ast_pthread_create(&dont_care, &attr, monitor_sig_flags, NULL);
+		ast_pthread_create(&mon_sig_flags, &attr, monitor_sig_flags, NULL);
 		pthread_attr_destroy(&attr);
 
 		set_icon("Asterisk");




More information about the asterisk-commits mailing list