mirror of
https://github.com/asterisk/asterisk.git
synced 2025-09-05 04:11:08 +00:00
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
This commit is contained in:
@@ -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);
|
||||
|
Reference in New Issue
Block a user