Author: kmoore
Date: Wed Aug 14 21:04:44 2013
New Revision: 396721

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=396721
Log:
Tests pass and parking can be unloaded and reloaded without issue

Modified:
    team/kmoore/parking_unload/include/asterisk/parking.h
    team/kmoore/parking_unload/main/parking.c
    team/kmoore/parking_unload/res/parking/parking_applications.c
    team/kmoore/parking_unload/res/parking/parking_bridge_features.c
    team/kmoore/parking_unload/res/parking/res_parking.h
    team/kmoore/parking_unload/res/res_parking.c

Modified: team/kmoore/parking_unload/include/asterisk/parking.h
URL: 
http://svnview.digium.com/svn/asterisk/team/kmoore/parking_unload/include/asterisk/parking.h?view=diff&rev=396721&r1=396720&r2=396721
==============================================================================
--- team/kmoore/parking_unload/include/asterisk/parking.h (original)
+++ team/kmoore/parking_unload/include/asterisk/parking.h Wed Aug 14 21:04:44 
2013
@@ -188,6 +188,16 @@
         * \retval non-zero on error
         */
        int (* parking_park_bridge_channel)(struct ast_bridge_channel *parkee, 
const char *parkee_uuid, const char *parker_uuid, const char *app_data);
+
+       /*!
+        * \brief Let the parking provider know it is being used.
+        */
+       void (* parking_ref)(void);
+
+       /*!
+        * \brief Let the parking provider know it is done being used.
+        */
+       void (* parking_unref)(void);
 };
 
 /*!

Modified: team/kmoore/parking_unload/main/parking.c
URL: 
http://svnview.digium.com/svn/asterisk/team/kmoore/parking_unload/main/parking.c?view=diff&rev=396721&r1=396720&r2=396721
==============================================================================
--- team/kmoore/parking_unload/main/parking.c (original)
+++ team/kmoore/parking_unload/main/parking.c Wed Aug 14 21:04:44 2013
@@ -124,19 +124,46 @@
        return payload;
 }
 
+struct parking_provider_wrapper {
+       /*! \brief The actual table that gets accessed */
+       struct ast_parking_bridge_feature_fn_table fn_table;
+       /*! \brief The pointer to the global object from which this table was 
created */
+       struct ast_parking_bridge_feature_fn_table *global;
+};
+
+static void provider_wrapper_dtor(void *obj)
+{
+       struct parking_provider_wrapper *wrapper = obj;
+       if (wrapper->fn_table.parking_unref) {
+               wrapper->fn_table.parking_unref();
+       }
+       ao2_cleanup(wrapper->global);
+       wrapper->global = NULL;
+}
+
 struct ast_parking_bridge_feature_fn_table 
*ast_parking_get_bridge_features(void)
 {
-       return (struct 
ast_parking_bridge_feature_fn_table*)ao2_global_obj_ref(parking_provider);
-}
-
-/*! \brief A wrapper around the fn_table to ao2-ify it */
-struct parking_provider_wrapper {
-       struct ast_parking_bridge_feature_fn_table fn_table;
-};
+       RAII_VAR(struct parking_provider_wrapper *, wrapper, 
ao2_alloc(sizeof(*wrapper), provider_wrapper_dtor), ao2_cleanup);
+       if (!wrapper) {
+               return NULL;
+       }
+
+       wrapper->global = ao2_global_obj_ref(parking_provider);
+       if (!wrapper->global) {
+               return NULL;
+       }
+
+       wrapper->fn_table = *wrapper->global;
+       if (wrapper->fn_table.parking_ref) {
+               wrapper->fn_table.parking_unref();
+       }
+       ao2_ref(wrapper, +1);
+       return (struct ast_parking_bridge_feature_fn_table *)wrapper;
+}
 
 int ast_parking_register_bridge_features(struct 
ast_parking_bridge_feature_fn_table *fn_table)
 {
-       RAII_VAR(struct parking_provider_wrapper *, wrapper,
+       RAII_VAR(struct ast_parking_bridge_feature_fn_table *, wrapper,
                ao2_global_obj_ref(parking_provider), ao2_cleanup);
 
        if (fn_table->module_version != PARKING_MODULE_VERSION) {
@@ -147,7 +174,7 @@
 
        if (wrapper) {
                ast_log(AST_LOG_WARNING, "Parking provider already registered 
by %s!\n",
-                       wrapper->fn_table.module_name);
+                       wrapper->module_name);
                return -1;
        }
 
@@ -155,7 +182,7 @@
        if (!wrapper) {
                return -1;
        }
-       wrapper->fn_table = *fn_table;
+       *wrapper = *fn_table;
 
        ao2_global_obj_replace(parking_provider, wrapper);
        return 0;
@@ -163,7 +190,7 @@
 
 int ast_parking_unregister_bridge_features(const char *module_name)
 {
-       RAII_VAR(struct parking_provider_wrapper *, wrapper,
+       RAII_VAR(struct ast_parking_bridge_feature_fn_table *, wrapper,
                ao2_global_obj_ref(parking_provider), ao2_cleanup);
 
        if (!wrapper) {
@@ -171,7 +198,7 @@
                return -1;
        }
 
-       if (strcmp(wrapper->fn_table.module_name, module_name)) {
+       if (strcmp(wrapper->module_name, module_name)) {
                ast_log(AST_LOG_WARNING, "%s has not registered the parking 
provider\n", module_name);
                return -1;
        }

Modified: team/kmoore/parking_unload/res/parking/parking_applications.c
URL: 
http://svnview.digium.com/svn/asterisk/team/kmoore/parking_unload/res/parking/parking_applications.c?view=diff&rev=396721&r1=396720&r2=396721
==============================================================================
--- team/kmoore/parking_unload/res/parking/parking_applications.c (original)
+++ team/kmoore/parking_unload/res/parking/parking_applications.c Wed Aug 14 
21:04:44 2013
@@ -195,6 +195,8 @@
        </application>
  ***/
 
+#define PARK_AND_ANNOUNCE_APPLICATION "ParkAndAnnounce"
+
 /* Park a call */
 
 enum park_args {
@@ -489,7 +491,7 @@
 
 }
 
-int park_app_exec(struct ast_channel *chan, const char *data)
+static int park_app_exec(struct ast_channel *chan, const char *data)
 {
        RAII_VAR(struct ast_bridge *, parking_bridge, NULL, ao2_cleanup);
 
@@ -548,7 +550,7 @@
 
 /* Retrieve a parked call */
 
-int parked_call_app_exec(struct ast_channel *chan, const char *data)
+static int parked_call_app_exec(struct ast_channel *chan, const char *data)
 {
        RAII_VAR(struct parking_lot *, lot, NULL, ao2_cleanup);
        RAII_VAR(struct parked_user *, pu, NULL, ao2_cleanup); /* Parked user 
being retrieved */
@@ -766,7 +768,7 @@
        *dial_string = '\0'; /* If we observe this dial string on a second 
pass, we don't want to do anything with it. */
 }
 
-int park_and_announce_app_exec(struct ast_channel *chan, const char *data)
+static int park_and_announce_app_exec(struct ast_channel *chan, const char 
*data)
 {
        struct ast_bridge_features chan_features;
        char *parse;
@@ -858,3 +860,27 @@
 
        return res;
 }
+
+int load_parking_applications(const struct ast_module_info *ast_module_info)
+{
+       if (ast_register_application_xml(PARK_APPLICATION, park_app_exec)) {
+               return -1;
+       }
+
+       if (ast_register_application_xml(PARKED_CALL_APPLICATION, 
parked_call_app_exec)) {
+               return -1;
+       }
+
+       if (ast_register_application_xml(PARK_AND_ANNOUNCE_APPLICATION, 
park_and_announce_app_exec)) {
+               return -1;
+       }
+
+       return 0;
+}
+
+void unload_parking_applications(void)
+{
+       ast_unregister_application(PARK_APPLICATION);
+       ast_unregister_application(PARKED_CALL_APPLICATION);
+       ast_unregister_application(PARK_AND_ANNOUNCE_APPLICATION);
+}

Modified: team/kmoore/parking_unload/res/parking/parking_bridge_features.c
URL: 
http://svnview.digium.com/svn/asterisk/team/kmoore/parking_unload/res/parking/parking_bridge_features.c?view=diff&rev=396721&r1=396720&r2=396721
==============================================================================
--- team/kmoore/parking_unload/res/parking/parking_bridge_features.c (original)
+++ team/kmoore/parking_unload/res/parking/parking_bridge_features.c Wed Aug 14 
21:04:44 2013
@@ -621,6 +621,8 @@
        .parking_blind_transfer_park = parking_blind_transfer_park,
        .parking_park_bridge_channel = parking_park_bridge_channel,
        .parking_park_call = parking_park_call,
+       .parking_ref = parking_ref,
+       .parking_unref = parking_unref,
 };
 
 void unload_parking_bridge_features(void)

Modified: team/kmoore/parking_unload/res/parking/res_parking.h
URL: 
http://svnview.digium.com/svn/asterisk/team/kmoore/parking_unload/res/parking/res_parking.h?view=diff&rev=396721&r1=396720&r2=396721
==============================================================================
--- team/kmoore/parking_unload/res/parking/res_parking.h (original)
+++ team/kmoore/parking_unload/res/parking/res_parking.h Wed Aug 14 21:04:44 
2013
@@ -32,6 +32,7 @@
 #define DEFAULT_PARKING_EXTEN "700"
 #define BASE_REGISTRAR "res_parking"
 #define PARK_DIAL_CONTEXT "park-dial"
+#define PARKED_CALL_APPLICATION "ParkedCall"
 
 enum park_call_resolution {
        PARK_UNSET = 0,         /*! Nothing set a resolution. This should never 
be observed in practice. */
@@ -461,53 +462,31 @@
  */
 int parking_dynamic_lots_enabled(void);
 
-/*!
- * \since 12.0.0
- * \brief Execution function for the parking application
- *
- * \param chan ast_channel entering the application
- * \param data arguments to the application
- *
- * \retval 0 the application executed in such a way that the channel should 
proceed in the dial plan
- * \retval -1 the channel should no longer proceed through the dial plan
- *
- * \note this function should only be used to register the parking application 
and not generally to park calls.
- */
-int park_app_exec(struct ast_channel *chan, const char *data);
-
-/*!
- * \since 12.0.0
- * \brief Execution function for the parked call application
- *
- * \param chan ast_channel entering the application
- * \param data arguments to the application
- *
- * \retval 0 the application executed in such a way that the channel should 
proceed in the dial plan
- * \retval -1 the channel should no longer proceed through the dial plan
- */
-int parked_call_app_exec(struct ast_channel *chan, const char *data);
-
-/*!
- * \since 12.0.0
- * \brief Execution function for the park and retrieve application
- *
- * \param chan ast_channel entering the application
- * \param data arguments to the application
- *
- * \retval 0 the application executed in such a way that the channel should 
proceed in the dial plan
- * \retval -1 the channel should no longer proceed through the dial plan
- *
- * \note this function should only be used to register the park and announce 
application and not generally to park and announce.
- */
-int park_and_announce_app_exec(struct ast_channel *chan, const char *data);
-
-/*!
- * \since 12.0.0
- * \brief Register CLI commands
+struct ast_module_info;
+/*!
+ * \since 12.0.0
+ * \brief Register parking applications
+ *
+ * \param ast_module_info The module's ast_module_info
  *
  * \retval 0 if successful
  * \retval -1 on failure
  */
+int load_parking_applications(const struct ast_module_info *ast_module_info);
+
+/*!
+ * \since 12.0.0
+ * \brief Unregister parking applications
+ */
+void unload_parking_applications(void);
+
+/*!
+ * \since 12.0.0
+ * \brief Register CLI commands
+ *
+ * \retval 0 if successful
+ * \retval -1 on failure
+ */
 int load_parking_ui(void);
 
 /*!
@@ -572,3 +551,15 @@
  * \retval nonzero on failure
  */
 int unload_parking_tests(void);
+
+/*!
+ * \since 12.0.0
+ * \brief Increment res_parking's use count
+ */
+void parking_ref(void);
+
+/*!
+ * \since 12.0.0
+ * \brief Decrement res_parking's use count
+ */
+void parking_unref(void);

Modified: team/kmoore/parking_unload/res/res_parking.c
URL: 
http://svnview.digium.com/svn/asterisk/team/kmoore/parking_unload/res/res_parking.c?view=diff&rev=396721&r1=396720&r2=396721
==============================================================================
--- team/kmoore/parking_unload/res/res_parking.c (original)
+++ team/kmoore/parking_unload/res/res_parking.c Wed Aug 14 21:04:44 2013
@@ -193,9 +193,6 @@
 #include "asterisk/manager.h"
 #include "asterisk/pbx.h"
 
-#define PARKED_CALL_APPLICATION "ParkedCall"
-#define PARK_AND_ANNOUNCE_APPLICATION "ParkAndAnnounce"
-
 /* TODO Add unit tests for parking */
 
 static int parking_lot_sort_fn(const void *obj_left, const void *obj_right, 
int flags)
@@ -1155,6 +1152,16 @@
        disable_marked_lots();
 }
 
+void parking_ref(void)
+{
+       ast_module_ref(ast_module_info->self);
+}
+
+void parking_unref(void)
+{
+       ast_module_unref(ast_module_info->self);
+}
+
 static int load_module(void)
 {
        parking_lot_container = 
ao2_container_alloc_list(AO2_ALLOC_OPT_LOCK_MUTEX,
@@ -1197,15 +1204,7 @@
                goto error;
        }
 
-       if (ast_register_application_xml(PARK_APPLICATION, park_app_exec)) {
-               goto error;
-       }
-
-       if (ast_register_application_xml(PARKED_CALL_APPLICATION, 
parked_call_app_exec)) {
-               goto error;
-       }
-
-       if (ast_register_application_xml(PARK_AND_ANNOUNCE_APPLICATION, 
park_and_announce_app_exec)) {
+       if (load_parking_applications(ast_module_info)) {
                goto error;
        }
 
@@ -1249,21 +1248,18 @@
 
 static int unload_module(void)
 {
-
-       
/*ast_parking_unregister_bridge_features(parking_provider.module_name);*/
-
-       /* XXX Parking is currently not unloadable due to the fact that it 
loads features which could cause
-        *     significant problems if they disappeared while a channel still 
had access to them.
-        */
-       return -1;
-
-       /* TODO Things we will need to do here:
-        *
-        *  destroy existing parking lots
-        *  uninstall parking related bridge features
-        *  remove extensions owned by the parking registrar
-        *  unload currently loaded unit tests, CLI/AMI commands, etc.
-        */
+       remove_all_configured_parking_lot_extensions();
+       unload_parking_bridge_features();
+       unload_parking_tests();
+       unload_parking_devstate();
+       unload_parking_manager();
+       unload_parking_ui();
+       unload_parking_applications();
+       ao2_cleanup(parking_lot_container);
+       parking_lot_container = NULL;
+       aco_info_destroy(&cfg_info);
+
+       return 0;
 }
 
 AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_LOAD_ORDER, "Call Parking 
Resource",


--
_____________________________________________________________________
-- Bandwidth and Colocation Provided by http://www.api-digital.com --

svn-commits mailing list
To UNSUBSCRIBE or update options visit:
   http://lists.digium.com/mailman/listinfo/svn-commits

Reply via email to