]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
res_stasis: fix intermittent delays on adding channel to bridge
authorMike Bradeen <mbradeen@sangoma.com>
Wed, 10 Jul 2024 18:58:44 +0000 (12:58 -0600)
committerAsterisk Development Team <asteriskteam@digium.com>
Thu, 12 Sep 2024 18:46:27 +0000 (18:46 +0000)
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
(cherry picked from commit bdee743cd40901a1a082be749ccb23541e720a49)

res/res_stasis.c
res/stasis/control.c
res/stasis/control.h

index 6b4c30d8947d201b0cc72387ee7457fb2e8bca0a..84244c2a133a09bef6f3f3ecc5cab09780330759 100644 (file)
@@ -1548,11 +1548,7 @@ int stasis_app_exec(struct ast_channel *chan, const char *app_name, int argc,
                        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);
-               control_set_thread(control, AST_PTHREADT_NULL);
 
                if (r < 0) {
                        ast_debug(3, "%s: Poll error\n",
index 4ed0e2af1cc25b7832cbadb25f37f25d38c25bb4..dfbc007399f1f04049840e9e7c59752ba641d942 100644 (file)
@@ -94,10 +94,6 @@ struct stasis_app_control {
         * The name of the next Stasis application to move to.
         */
        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.
         */
@@ -162,8 +158,6 @@ struct stasis_app_control *control_create(struct ast_channel *channel, struct st
        control->next_app = NULL;
        AST_VECTOR_INIT(&control->next_app_args, 0);
 
-       control_set_thread(control, AST_PTHREADT_NULL);
-
        return control;
 }
 
@@ -193,13 +187,6 @@ static void app_control_unregister_rule(
        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
  * \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);
        ast_cond_signal(&control->wait_cond);
 
-       if (control->control_thread != AST_PTHREADT_NULL) {
-               /* if the control thread is waiting on the channel, send the SIGURG
-                  to let it know there is a new command */
-               pthread_kill(control->control_thread, SIGURG);
+       if (control->channel) {
+               /* Queue a null frame so that if and when the channel is waited on,
+                  return immediately to process the new command */
+               ast_queue_frame(control->channel, &ast_null_frame);
        }
 
        ao2_unlock(control->command_queue);
index 3593f8a40ffda51ef03966f0e0c37c1b777d2fd0..137ac81557100688fbaa3294139410726c1ed063 100644 (file)
@@ -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);
 
-/*!
- * \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.
  *