res_stasis: fix intermittent delays on adding channel to bridge

Previously, on command execution, the control thread was awoken by
sending a SIGURG. It was found that this still resulted in some
instances where the thread was not immediately awoken.

This change instead sends a null frame to awaken the control thread,
which awakens the thread more consistently.

Resolves: #801
pull/834/head
Mike Bradeen 10 months ago committed by asterisk-org-access-app[bot]
parent 291c1e4c1f
commit a824a0cdb4

@ -1548,11 +1548,7 @@ int stasis_app_exec(struct ast_channel *chan, const char *app_name, int argc,
continue; continue;
} }
/* Set this thread's id as the control thread id so that any
new commands can signal out of this wait */
control_set_thread(control, pthread_self());
r = ast_waitfor(chan, MAX_WAIT_MS); r = ast_waitfor(chan, MAX_WAIT_MS);
control_set_thread(control, AST_PTHREADT_NULL);
if (r < 0) { if (r < 0) {
ast_debug(3, "%s: Poll error\n", ast_debug(3, "%s: Poll error\n",

@ -94,10 +94,6 @@ struct stasis_app_control {
* The name of the next Stasis application to move to. * The name of the next Stasis application to move to.
*/ */
char *next_app; char *next_app;
/*!
* The thread currently blocking on the channel.
*/
pthread_t control_thread;
/*! /*!
* The list of arguments to pass to StasisStart when moving to another app. * The list of arguments to pass to StasisStart when moving to another app.
*/ */
@ -162,8 +158,6 @@ struct stasis_app_control *control_create(struct ast_channel *channel, struct st
control->next_app = NULL; control->next_app = NULL;
AST_VECTOR_INIT(&control->next_app_args, 0); AST_VECTOR_INIT(&control->next_app_args, 0);
control_set_thread(control, AST_PTHREADT_NULL);
return control; return control;
} }
@ -193,13 +187,6 @@ static void app_control_unregister_rule(
ao2_unlock(control->command_queue); ao2_unlock(control->command_queue);
} }
void control_set_thread(struct stasis_app_control *control, pthread_t threadid)
{
ao2_lock(control->command_queue);
control->control_thread = threadid;
ao2_unlock(control->command_queue);
}
/*! /*!
* \internal * \internal
* \brief Checks to make sure each rule in the given list passes. * \brief Checks to make sure each rule in the given list passes.
@ -309,10 +296,10 @@ static struct stasis_app_command *exec_command_on_condition(
ao2_link_flags(control->command_queue, command, OBJ_NOLOCK); ao2_link_flags(control->command_queue, command, OBJ_NOLOCK);
ast_cond_signal(&control->wait_cond); ast_cond_signal(&control->wait_cond);
if (control->control_thread != AST_PTHREADT_NULL) { if (control->channel) {
/* if the control thread is waiting on the channel, send the SIGURG /* Queue a null frame so that if and when the channel is waited on,
to let it know there is a new command */ return immediately to process the new command */
pthread_kill(control->control_thread, SIGURG); ast_queue_frame(control->channel, &ast_null_frame);
} }
ao2_unlock(control->command_queue); ao2_unlock(control->command_queue);

@ -48,15 +48,6 @@ struct stasis_app_control *control_create(struct ast_channel *channel, struct st
*/ */
void control_flush_queue(struct stasis_app_control *control); void control_flush_queue(struct stasis_app_control *control);
/*!
* \brief set the control's thread id
* \since 18
*
* \param control Control object on which to set the thread id.
* \param threadid id to set
*/
void control_set_thread(struct stasis_app_control *control, pthread_t threadid);
/*! /*!
* \brief Dispatch all commands enqueued to this control. * \brief Dispatch all commands enqueued to this control.
* *

Loading…
Cancel
Save