Skip to content
Snippets Groups Projects
  • Richard Mudgett's avatar
    334f13d8
    Allow AMI action callback to be reentrant. · 334f13d8
    Richard Mudgett authored
    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
    334f13d8
    History
    Allow AMI action callback to be reentrant.
    Richard Mudgett authored
    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