*/
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;
/*!
*/
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
*
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);
}
/*!
*/
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;
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);
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) {
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;
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) {
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;
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;
/* 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;
}
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);
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;
}
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) {
/* 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;
}
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)) {
return;
}
- if (!(serializer = ast_sip_create_serializer())) {
+ serializer = create_websocket_serializer();
+ if (!serializer) {
ast_websocket_unref(session);
return;
}