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
pull/850/head^2
Alexei Gradinari 8 months ago committed by asterisk-org-access-app[bot]
parent 2f5b143b08
commit c49b766f06

@ -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

Loading…
Cancel
Save