aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authortilghman <tilghman@f38db490-d61c-443f-a65b-d21fe96a405b>2010-07-23 16:42:25 +0000
committertilghman <tilghman@f38db490-d61c-443f-a65b-d21fe96a405b>2010-07-23 16:42:25 +0000
commit14dbcc3a478c481f485046d86cebf459e20ff334 (patch)
tree9197b5ade1e0df1b19d43c27a6586b6e5265e500
parent1e59e0f8b928dffa972c7f3ab9788ce7f5313289 (diff)
Avoid race with consolethread on shutdown (on parallel processors).
(closes issue #17080) Reported by: sybasesql Patches: 20100721__issue17080.diff.txt uploaded by tilghman (license 14) Tested by: sybasesql git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.4@278981 f38db490-d61c-443f-a65b-d21fe96a405b
-rw-r--r--main/asterisk.c19
1 files changed, 13 insertions, 6 deletions
diff --git a/main/asterisk.c b/main/asterisk.c
index 33aaaf2fc..c62447089 100644
--- a/main/asterisk.c
+++ b/main/asterisk.c
@@ -1320,14 +1320,21 @@ static void quit_handler(int num, int nice, int safeshutdown, int restart)
ast_module_shutdown();
}
if (ast_opt_console || ast_opt_remote) {
- if (getenv("HOME"))
+ if (getenv("HOME")) {
snprintf(filename, sizeof(filename), "%s/.asterisk_history", getenv("HOME"));
- if (!ast_strlen_zero(filename))
+ }
+ if (!ast_strlen_zero(filename)) {
ast_el_write_history(filename);
- if (el != NULL)
- el_end(el);
- if (el_hist != NULL)
- history_end(el_hist);
+ }
+ if (consolethread == AST_PTHREADT_NULL || consolethread == pthread_self()) {
+ /* Only end if we are the consolethread, otherwise there's a race with that thread. */
+ if (el != NULL) {
+ el_end(el);
+ }
+ if (el_hist != NULL) {
+ history_end(el_hist);
+ }
+ }
}
if (option_verbose)
ast_verbose("Executing last minute cleanups\n");