From c49b766f068d759fff1448ec07a032381cb2d845 Mon Sep 17 00:00:00 2001 From: Alexei Gradinari Date: Wed, 4 Sep 2024 10:28:57 -0400 Subject: [PATCH] autoservice: Do not sleep if autoservice_stop is called within autoservice thread 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 | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/main/autoservice.c b/main/autoservice.c index 8ff2cb56e1..131075e8d6 100644 --- a/main/autoservice.c +++ b/main/autoservice.c @@ -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