mirror of
https://github.com/asterisk/asterisk.git
synced 2025-09-03 03:20:57 +00:00
Allow AMI action callback to be reentrant.
Fix AMI module reload deadlock regression from ASTERISK-18479 when it tried to fix the race between calling an AMI action callback and unregistering that action. Refixes ASTERISK-13784 broken by ASTERISK-17785 change. Locking the ao2 object guaranteed that there were no active callbacks that mattered when ast_manager_unregister() was called. Unfortunately, this causes the deadlock situation. The patch stops locking the ao2 object to allow multiple threads to invoke the callback re-entrantly. There is no way to guarantee a module unload will not crash because of an active callback. The code attempts to minimize the chance with the registered flag and the maximum 5 second delay before ast_manager_unregister() returns. The trunk version of the patch changes the API to fix the race condition correctly to prevent the module code from unloading from memory while an action callback is active. * Don't hold the lock while calling the AMI action callback. (closes issue ASTERISK-19487) Reported by: Philippe Lindheimer Review: https://reviewboard.asterisk.org/r/1818/ Review: https://reviewboard.asterisk.org/r/1820/ ........ Merged revisions 359979 from http://svn.asterisk.org/svn/asterisk/branches/1.8 ........ Merged revisions 359980 from http://svn.asterisk.org/svn/asterisk/branches/10 git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@359981 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
@@ -8193,9 +8193,9 @@ int ast_features_init(void)
|
||||
if (!res)
|
||||
res = ast_register_application2(parkcall, park_call_exec, NULL, NULL, NULL);
|
||||
if (!res) {
|
||||
ast_manager_register_xml("ParkedCalls", 0, manager_parking_status);
|
||||
ast_manager_register_xml("Park", EVENT_FLAG_CALL, manager_park);
|
||||
ast_manager_register_xml("Bridge", EVENT_FLAG_CALL, action_bridge);
|
||||
ast_manager_register_xml_core("ParkedCalls", 0, manager_parking_status);
|
||||
ast_manager_register_xml_core("Park", EVENT_FLAG_CALL, manager_park);
|
||||
ast_manager_register_xml_core("Bridge", EVENT_FLAG_CALL, action_bridge);
|
||||
}
|
||||
|
||||
res |= ast_devstate_prov_add("Park", metermaidstate);
|
||||
|
Reference in New Issue
Block a user