]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
res_stasis: trigger cleanup after update
authorKevin Harwell <kharwell@digium.com>
Mon, 27 Jan 2020 17:44:45 +0000 (11:44 -0600)
committerGeorge Joseph <gjoseph@digium.com>
Thu, 30 Jan 2020 16:21:57 +0000 (10:21 -0600)
The cleanup code in stasis shuts down applications if they are in a deactivated
state, and no longer have explicit subscriptions. When registering an app the
cleanup code was running before calling 'update'. When it should be executed
after 'update' since a call to register may re-activate the app. We don't want
it to shutdown before the 'update' otherwise the app won't be re-activated,
or registered.

This patch makes it so the cleanup code is executed post 'update'.

ASTERISK-28679 #close

Change-Id: I8f2c0b17e33bb8128441567b97fd4c7bf74a327b
(cherry picked from commit 7031c3b7bd5871c965df7d507d3f1d95aaaba9e8)

res/res_stasis.c

index fe89da567aca8797753a48dd643788592c18f81f..64f05ef72670bee59856ef87f98e820412c1b608 100644 (file)
@@ -1715,12 +1715,11 @@ static int __stasis_app_register(const char *app_name, stasis_app_cb handler, vo
        if (app) {
                /*
                 * We need to unlock the apps_registry before calling app_update to
-                * prevent the possibility of a deadlock with the session.  We'll still
-                * run the lazy cleanup first though.
+                * prevent the possibility of a deadlock with the session.
                 */
-               cleanup();
                ao2_unlock(apps_registry);
                app_update(app, handler, data);
+               cleanup();
                return 0;
        }
 
@@ -1745,11 +1744,12 @@ static int __stasis_app_register(const char *app_name, stasis_app_cb handler, vo
        }
        ao2_link_flags(apps_registry, app, OBJ_NOLOCK);
 
+       ao2_unlock(apps_registry);
+
        /* We lazily clean up the apps_registry, because it's good enough to
         * prevent memory leaks, and we're lazy.
         */
        cleanup();
-       ao2_unlock(apps_registry);
        return 0;
 }