diff options
author | Terry Wilson <twilson@digium.com> | 2012-05-22 17:29:12 +0000 |
---|---|---|
committer | Terry Wilson <twilson@digium.com> | 2012-05-22 17:29:12 +0000 |
commit | c7f2d02ef1d4e5c10987c807ecec377453bb425c (patch) | |
tree | da503e5fa4934f3ac37b243571c4cc6ca2641e0c /main/asterisk.c | |
parent | 1ffb200c0e8642b7fb5c4f174e0064877f0c3d85 (diff) |
Fix race condition for CEL LINKEDID_END event
This patch fixes to situations that could cause the CEL LINKEDID_END event to
be missed.
1) During a core stop gracefully, modules are unloaded when ast_active_channels
== 0. The LINKDEDID_END event fires during the channel destructor. This means
that occasionally, the cel_* module will be unloaded before the channel is
destroyed. It seemed generally useful to wait until the refcount of all
channels == 0 before unloading, so I added a channel counter and used it in the
shutdown code.
2) During a masquerade, ast_channel_change_linkedid is called. It calls
ast_cel_check_retire_linkedid which unrefs the linkedid in the linkedids
container in cel.c. It didn't ref the new linkedid. Now it does.
Review: https://reviewboard.asterisk.org/r/1900/
........
Merged revisions 367292 from http://svn.asterisk.org/svn/asterisk/branches/1.8
........
Merged revisions 367299 from http://svn.asterisk.org/svn/asterisk/branches/10
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@367309 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'main/asterisk.c')
-rw-r--r-- | main/asterisk.c | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/main/asterisk.c b/main/asterisk.c index 972c2fbb1..849cbdd80 100644 --- a/main/asterisk.c +++ b/main/asterisk.c @@ -1704,7 +1704,7 @@ static int can_safely_quit(shutdown_nice_t niceness, int restart) for (;;) { time(&e); /* Wait up to 15 seconds for all channels to go away */ - if ((e - s) > 15 || !ast_active_channels() || shuttingdown != niceness) { + if ((e - s) > 15 || !ast_undestroyed_channels() || shuttingdown != niceness) { break; } /* Sleep 1/10 of a second */ @@ -1718,7 +1718,7 @@ static int can_safely_quit(shutdown_nice_t niceness, int restart) ast_verb(0, "Waiting for inactivity to perform %s...\n", restart ? "restart" : "halt"); } for (;;) { - if (!ast_active_channels() || shuttingdown != niceness) { + if (!ast_undestroyed_channels() || shuttingdown != niceness) { break; } sleep(1); |