From cf8e7a580bd865ebd563b3eba261111a908bd41a Mon Sep 17 00:00:00 2001 From: Richard Mudgett Date: Wed, 6 Jan 2016 19:10:16 -0600 Subject: [PATCH] res_pjsip: Create human friendly serializer names. PJSIP name formats: pjsip/aor/- -- registrar thread pool serializer pjsip/default- -- default thread pool serializer pjsip/messaging -- messaging thread pool serializer pjsip/outreg/- -- outbound registration thread pool serializer pjsip/pubsub/- -- pubsub thread pool serializer pjsip/refer/- -- REFER thread pool serializer pjsip/session/- -- session thread pool serializer pjsip/websocket- -- websocket thread pool serializer Change-Id: Iff9df8da3ddae1132cb2ef65f64df0c465c5e084 --- include/asterisk/res_pjsip.h | 31 ++++++++++++++++++++++++ res/res_pjsip.c | 35 +++++++++++++++++++-------- res/res_pjsip_messaging.c | 2 +- res/res_pjsip_outbound_registration.c | 8 +++++- res/res_pjsip_pubsub.c | 7 +++++- res/res_pjsip_refer.c | 7 +++++- res/res_pjsip_registrar.c | 7 +++++- res/res_pjsip_session.c | 7 +++++- res/res_pjsip_transport_websocket.c | 21 +++++++++++----- 9 files changed, 103 insertions(+), 22 deletions(-) diff --git a/include/asterisk/res_pjsip.h b/include/asterisk/res_pjsip.h index 6ca56bdcf3..17fcd2bd96 100644 --- a/include/asterisk/res_pjsip.h +++ b/include/asterisk/res_pjsip.h @@ -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 * diff --git a/res/res_pjsip.c b/res/res_pjsip.c index 8e99c55d45..3c392f02b5 100644 --- a/res/res_pjsip.c +++ b/res/res_pjsip.c @@ -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; diff --git a/res/res_pjsip_messaging.c b/res/res_pjsip_messaging.c index dab70ca968..54880dba92 100644 --- a/res/res_pjsip_messaging.c +++ b/res/res_pjsip_messaging.c @@ -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); diff --git a/res/res_pjsip_outbound_registration.c b/res/res_pjsip_outbound_registration.c index 4ba57481b6..a2fefde8c5 100644 --- a/res/res_pjsip_outbound_registration.c +++ b/res/res_pjsip_outbound_registration.c @@ -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; diff --git a/res/res_pjsip_pubsub.c b/res/res_pjsip_pubsub.c index 99376b142c..cdd1e8029b 100644 --- a/res/res_pjsip_pubsub.c +++ b/res/res_pjsip_pubsub.c @@ -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; diff --git a/res/res_pjsip_refer.c b/res/res_pjsip_refer.c index 4896a00e8a..c23097e60e 100644 --- a/res/res_pjsip_refer.c +++ b/res/res_pjsip_refer.c @@ -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; } diff --git a/res/res_pjsip_registrar.c b/res/res_pjsip_registrar.c index fed4393b05..b0f8d66f3d 100644 --- a/res/res_pjsip_registrar.c +++ b/res/res_pjsip_registrar.c @@ -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; } diff --git a/res/res_pjsip_session.c b/res/res_pjsip_session.c index 6044ceb7fa..4f5071fe4c 100644 --- a/res/res_pjsip_session.c +++ b/res/res_pjsip_session.c @@ -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; } diff --git a/res/res_pjsip_transport_websocket.c b/res/res_pjsip_transport_websocket.c index a49eaded51..668129b82a 100644 --- a/res/res_pjsip_transport_websocket.c +++ b/res/res_pjsip_transport_websocket.c @@ -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; }