]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
autoservice: Do not sleep if autoservice_stop is called within autoservice thread
authorAlexei Gradinari <alex2grad@gmail.com>
Wed, 4 Sep 2024 14:28:57 +0000 (10:28 -0400)
committerAlexei Gradinari <alex2grad@gmail.com>
Mon, 9 Sep 2024 23:17:16 +0000 (23:17 +0000)
It's possible that ast_autoservice_stop is called within the autoservice thread.
In this case the autoservice thread is stuck in an endless sleep.

To avoid endless sleep ast_autoservice_stop must check that it's not called
within the autoservice thread.

Fixes: #763
main/autoservice.c

index 8ff2cb56e16da8e1d737b2d1d12ff3e5296ececa..131075e8d6b57ed6a114715cf4ff83a4fce75321 100644 (file)
@@ -309,9 +309,16 @@ int ast_autoservice_stop(struct ast_channel *chan)
                return 0;
        }
 
-       /* Wait while autoservice thread rebuilds its list. */
-       while (chan_list_state == as_chan_list_state) {
-               usleep(1000);
+       if (asthread != AST_PTHREADT_NULL && pthread_equal(pthread_self(), asthread)) {
+               /* Do not sleep if ast_autoservice_stop is called within the autoservice thread,
+                  otherwise the thread will be stuck in an endless sleep. */
+               ast_debug(1, "ast_autoservice_stop is called within the autoservice thread, channel %s\n",
+                       ast_channel_name(chan));
+       } else {
+               /* Wait while autoservice thread rebuilds its list. */
+               while (chan_list_state == as_chan_list_state) {
+                       usleep(1000);
+               }
        }
 
        /* Now autoservice thread should have no references to our entry