]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
res_pjsip: Create human friendly serializer names. 49/1949/2
authorRichard Mudgett <rmudgett@digium.com>
Thu, 7 Jan 2016 01:10:16 +0000 (19:10 -0600)
committerRichard Mudgett <rmudgett@digium.com>
Sat, 9 Jan 2016 04:08:35 +0000 (22:08 -0600)
PJSIP name formats:
pjsip/aor/<aor>-<seq> -- registrar thread pool serializer
pjsip/default-<seq> -- default thread pool serializer
pjsip/messaging -- messaging thread pool serializer
pjsip/outreg/<registration>-<seq> -- outbound registration thread pool
serializer
pjsip/pubsub/<endpoint>-<seq> -- pubsub thread pool serializer
pjsip/refer/<endpoint>-<seq> -- REFER thread pool serializer
pjsip/session/<endpoint>-<seq> -- session thread pool serializer
pjsip/websocket-<seq> -- websocket thread pool serializer

Change-Id: Iff9df8da3ddae1132cb2ef65f64df0c465c5e084

include/asterisk/res_pjsip.h
res/res_pjsip.c
res/res_pjsip_messaging.c
res/res_pjsip_outbound_registration.c
res/res_pjsip_pubsub.c
res/res_pjsip_refer.c
res/res_pjsip_registrar.c
res/res_pjsip_session.c
res/res_pjsip_transport_websocket.c

index 6ca56bdcf38b1e74f3c340e5a741e4af02d3ef5f..17fcd2bd96f291b363e2d0a3b1eeefad1d8e1c69 100644 (file)
@@ -1124,6 +1124,21 @@ struct ast_sip_endpoint *ast_sip_get_artificial_endpoint(void);
  */
 struct ast_taskprocessor *ast_sip_create_serializer(void);
 
+/*!
+ * \brief Create a new serializer for SIP tasks
+ * \since 13.8.0
+ *
+ * See \ref ast_threadpool_serializer for more information on serializers.
+ * SIP creates serializers so that tasks operating on similar data will run
+ * in sequence.
+ *
+ * \param name Name of the serializer. (must be unique)
+ *
+ * \retval NULL Failure
+ * \retval non-NULL Newly-created serializer
+ */
+struct ast_taskprocessor *ast_sip_create_serializer_named(const char *name);
+
 struct ast_serializer_shutdown_group;
 
 /*!
@@ -1141,6 +1156,22 @@ struct ast_serializer_shutdown_group;
  */
 struct ast_taskprocessor *ast_sip_create_serializer_group(struct ast_serializer_shutdown_group *shutdown_group);
 
+/*!
+ * \brief Create a new serializer for SIP tasks
+ * \since 13.8.0
+ *
+ * See \ref ast_threadpool_serializer for more information on serializers.
+ * SIP creates serializers so that tasks operating on similar data will run
+ * in sequence.
+ *
+ * \param name Name of the serializer. (must be unique)
+ * \param shutdown_group Group shutdown controller. (NULL if no group association)
+ *
+ * \retval NULL Failure
+ * \retval non-NULL Newly-created serializer
+ */
+struct ast_taskprocessor *ast_sip_create_serializer_group_named(const char *name, struct ast_serializer_shutdown_group *shutdown_group);
+
 /*!
  * \brief Set a serializer on a SIP dialog so requests and responses are automatically serialized
  *
index 8e99c55d45e38f87125aee6b5e31d518f55ee85b..3c392f02b59d53b278b8904cf259c7caa2e34b20 100644 (file)
@@ -3379,23 +3379,34 @@ int ast_sip_append_body(pjsip_tx_data *tdata, const char *body_text)
        return 0;
 }
 
+struct ast_taskprocessor *ast_sip_create_serializer_group_named(const char *name, struct ast_serializer_shutdown_group *shutdown_group)
+{
+       return ast_threadpool_serializer_group(name, sip_threadpool, shutdown_group);
+}
+
 struct ast_taskprocessor *ast_sip_create_serializer_group(struct ast_serializer_shutdown_group *shutdown_group)
 {
-       struct ast_taskprocessor *serializer;
-       char name[AST_UUID_STR_LEN];
+       char tps_name[AST_TASKPROCESSOR_MAX_NAME + 1];
 
-       ast_uuid_generate_str(name, sizeof(name));
+       /* Create name with seq number appended. */
+       ast_taskprocessor_build_name(tps_name, sizeof(tps_name), "pjsip-group-serializer");
 
-       serializer = ast_threadpool_serializer_group(name, sip_threadpool, shutdown_group);
-       if (!serializer) {
-               return NULL;
-       }
-       return serializer;
+       return ast_sip_create_serializer_group_named(tps_name, shutdown_group);
+}
+
+struct ast_taskprocessor *ast_sip_create_serializer_named(const char *name)
+{
+       return ast_sip_create_serializer_group_named(name, NULL);
 }
 
 struct ast_taskprocessor *ast_sip_create_serializer(void)
 {
-       return ast_sip_create_serializer_group(NULL);
+       char tps_name[AST_TASKPROCESSOR_MAX_NAME + 1];
+
+       /* Create name with seq number appended. */
+       ast_taskprocessor_build_name(tps_name, sizeof(tps_name), "pjsip-serializer");
+
+       return ast_sip_create_serializer_group_named(tps_name, NULL);
 }
 
 /*!
@@ -3425,10 +3436,14 @@ static void serializer_pool_shutdown(void)
  */
 static int serializer_pool_setup(void)
 {
+       char tps_name[AST_TASKPROCESSOR_MAX_NAME + 1];
        int idx;
 
        for (idx = 0; idx < SERIALIZER_POOL_SIZE; ++idx) {
-               serializer_pool[idx] = ast_sip_create_serializer();
+               /* Create name with seq number appended. */
+               ast_taskprocessor_build_name(tps_name, sizeof(tps_name), "pjsip/default");
+
+               serializer_pool[idx] = ast_sip_create_serializer_named(tps_name);
                if (!serializer_pool[idx]) {
                        serializer_pool_shutdown();
                        return -1;
index dab70ca9689cf18e935d5993f1eb64558ad1d525..54880dba92ad5ed3760819eb5c65af138e7fe6f5 100644 (file)
@@ -758,7 +758,7 @@ static int load_module(void)
                return AST_MODULE_LOAD_DECLINE;
        }
 
-       message_serializer = ast_sip_create_serializer();
+       message_serializer = ast_sip_create_serializer_named("pjsip/messaging");
        if (!message_serializer) {
                ast_sip_unregister_service(&messaging_module);
                ast_msg_tech_unregister(&msg_tech);
index 4ba57481b6c61fab41b931d10ec1640a9930b6eb..a2fefde8c51350181a2969775c055a226bd2b4ba 100644 (file)
@@ -977,6 +977,7 @@ static void sip_outbound_registration_client_state_destroy(void *obj)
 static struct sip_outbound_registration_state *sip_outbound_registration_state_alloc(struct sip_outbound_registration *registration)
 {
        struct sip_outbound_registration_state *state;
+       char tps_name[AST_TASKPROCESSOR_MAX_NAME + 1];
 
        state = ao2_alloc(sizeof(*state), sip_outbound_registration_state_destroy);
        if (!state) {
@@ -989,7 +990,12 @@ static struct sip_outbound_registration_state *sip_outbound_registration_state_a
                return NULL;
        }
 
-       state->client_state->serializer = ast_sip_create_serializer_group(shutdown_group);
+       /* Create name with seq number appended. */
+       ast_taskprocessor_build_name(tps_name, sizeof(tps_name), "pjsip/outreg/%s",
+               ast_sorcery_object_get_id(registration));
+
+       state->client_state->serializer = ast_sip_create_serializer_group_named(tps_name,
+               shutdown_group);
        if (!state->client_state->serializer) {
                ao2_cleanup(state);
                return NULL;
index 99376b142c0d93c2e2f074b18b0468ba6a89b46a..cdd1e8029bcb28aaa9a20712bd8e2cfe5b9bc9d7 100644 (file)
@@ -1234,6 +1234,7 @@ static void subscription_setup_dialog(struct sip_subscription_tree *sub_tree, pj
 static struct sip_subscription_tree *allocate_subscription_tree(struct ast_sip_endpoint *endpoint)
 {
        struct sip_subscription_tree *sub_tree;
+       char tps_name[AST_TASKPROCESSOR_MAX_NAME + 1];
 
        sub_tree = ao2_alloc(sizeof *sub_tree, subscription_tree_destructor);
        if (!sub_tree) {
@@ -1242,7 +1243,11 @@ static struct sip_subscription_tree *allocate_subscription_tree(struct ast_sip_e
 
        ast_module_ref(ast_module_info->self);
 
-       sub_tree->serializer = ast_sip_create_serializer();
+       /* Create name with seq number appended. */
+       ast_taskprocessor_build_name(tps_name, sizeof(tps_name), "pjsip/pubsub/%s",
+               ast_sorcery_object_get_id(endpoint));
+
+       sub_tree->serializer = ast_sip_create_serializer_named(tps_name);
        if (!sub_tree->serializer) {
                ao2_ref(sub_tree, -1);
                return NULL;
index 4896a00e8a858c0273e5bf5fa751b0300084336e..c23097e60e4f88963aad3887f3a51857d0cd08bb 100644 (file)
@@ -342,6 +342,7 @@ static int refer_progress_alloc(struct ast_sip_session *session, pjsip_rx_data *
        const pj_str_t str_true = { "true", 4 };
        pjsip_tx_data *tdata;
        pjsip_hdr hdr_list;
+       char tps_name[AST_TASKPROCESSOR_MAX_NAME + 1];
 
        *progress = NULL;
 
@@ -363,7 +364,11 @@ static int refer_progress_alloc(struct ast_sip_session *session, pjsip_rx_data *
        /* To prevent a potential deadlock we need the dialog so we can lock/unlock */
        (*progress)->dlg = session->inv_session->dlg;
 
-       if (!((*progress)->serializer = ast_sip_create_serializer())) {
+       /* Create name with seq number appended. */
+       ast_taskprocessor_build_name(tps_name, sizeof(tps_name), "pjsip/refer/%s",
+               ast_sorcery_object_get_id(session->endpoint));
+
+       if (!((*progress)->serializer = ast_sip_create_serializer_named(tps_name))) {
                goto error;
        }
 
index fed4393b05025364bb768cb4a3a8c424116adfa7..b0f8d66f3d703c0f738a800c5979bf7a2b98b91a 100644 (file)
@@ -231,6 +231,7 @@ static void serializer_destroy(void *obj)
 
 static struct serializer *serializer_create(const char *aor_name)
 {
+       char tps_name[AST_TASKPROCESSOR_MAX_NAME + 1];
        size_t size = strlen(aor_name) + 1;
        struct serializer *ser = ao2_alloc(
                sizeof(*ser) + size, serializer_destroy);
@@ -239,7 +240,11 @@ static struct serializer *serializer_create(const char *aor_name)
                return NULL;
        }
 
-       if (!(ser->serializer = ast_sip_create_serializer())) {
+       /* Create name with seq number appended. */
+       ast_taskprocessor_build_name(tps_name, sizeof(tps_name), "pjsip/aor/%s",
+               aor_name);
+
+       if (!(ser->serializer = ast_sip_create_serializer_named(tps_name))) {
                ao2_ref(ser, -1);
                return NULL;
        }
index 6044ceb7fa48de2a2b7b3e69453d41d8b718b05d..4f5071fe4ce91efcaf1d1d4561df3e31ea22bbc1 100644 (file)
@@ -1266,6 +1266,7 @@ struct ast_sip_session *ast_sip_session_alloc(struct ast_sip_endpoint *endpoint,
        RAII_VAR(struct ast_sip_session *, session, NULL, ao2_cleanup);
        struct ast_sip_session_supplement *iter;
        int dsp_features = 0;
+       char tps_name[AST_TASKPROCESSOR_MAX_NAME + 1];
 
        session = ao2_alloc(sizeof(*session), session_destructor);
        if (!session) {
@@ -1286,7 +1287,11 @@ struct ast_sip_session *ast_sip_session_alloc(struct ast_sip_endpoint *endpoint,
        /* fill session->media with available types */
        ao2_callback(sdp_handlers, OBJ_NODATA, add_session_media, session);
 
-       session->serializer = ast_sip_create_serializer();
+       /* Create name with seq number appended. */
+       ast_taskprocessor_build_name(tps_name, sizeof(tps_name), "pjsip/session/%s",
+               ast_sorcery_object_get_id(endpoint));
+
+       session->serializer = ast_sip_create_serializer_named(tps_name);
        if (!session->serializer) {
                return NULL;
        }
index a49eaded51548beef1f7672beee6f780b269008f..668129b82a415eaa6a081e433a7adc0d215ee50a 100644 (file)
@@ -303,14 +303,22 @@ static int get_write_timeout(void)
        return write_timeout;
 }
 
-/*!
- \brief WebSocket connection handler.
- */
+static struct ast_taskprocessor *create_websocket_serializer(void)
+{
+       char tps_name[AST_TASKPROCESSOR_MAX_NAME + 1];
+
+       /* Create name with seq number appended. */
+       ast_taskprocessor_build_name(tps_name, sizeof(tps_name), "pjsip/websocket");
+
+       return ast_sip_create_serializer_named(tps_name);
+}
+
+/*! \brief WebSocket connection handler. */
 static void websocket_cb(struct ast_websocket *session, struct ast_variable *parameters, struct ast_variable *headers)
 {
-       struct ast_taskprocessor *serializer = NULL;
+       struct ast_taskprocessor *serializer;
        struct transport_create_data create_data;
-       struct ws_transport *transport = NULL;
+       struct ws_transport *transport;
        struct transport_read_data read_data;
 
        if (ast_websocket_set_nonblock(session)) {
@@ -323,7 +331,8 @@ static void websocket_cb(struct ast_websocket *session, struct ast_variable *par
                return;
        }
 
-       if (!(serializer = ast_sip_create_serializer())) {
+       serializer = create_websocket_serializer();
+       if (!serializer) {
                ast_websocket_unref(session);
                return;
        }