From e96448e991d0c9285baa413c73a336189f6c5ba5 Mon Sep 17 00:00:00 2001 From: Walter Doekes Date: Mon, 19 Sep 2016 16:40:40 +0200 Subject: asterisk.c: When astcanary dies on linux, reset priority on all threads. Previously only the canary checking thread itself had its priority set to SCHED_OTHER. Now all threads are traversed and adjusted. ASTERISK-19867 #close Reported by: Xavier Hienne Change-Id: Ie0dd02a3ec42f66a78303e9c1aac28f7ed9aae39 --- main/asterisk.c | 42 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) (limited to 'main/asterisk.c') diff --git a/main/asterisk.c b/main/asterisk.c index b8eedfa38..f463849e5 100644 --- a/main/asterisk.c +++ b/main/asterisk.c @@ -1863,6 +1863,46 @@ static void set_icon(char *text) fprintf(stdout, "\033]1;%s\007", text); } +/*! \brief Set priority on all known threads. */ +static int set_priority_all(int pri) +{ +#if !defined(__linux__) + /* The non-linux version updates the entire process prio. */ + return ast_set_priority(pri); +#elif defined(LOW_MEMORY) + ast_log(LOG_WARNING, "Unable to enumerate all threads to update priority\n"); + return ast_set_priority(pri); +#else + struct thread_list_t *cur; + struct sched_param sched; + char const *policy_str; + int policy; + + memset(&sched, 0, sizeof(sched)); + if (pri) { + policy = SCHED_RR; + policy_str = "realtime"; + sched.sched_priority = 10; + } else { + policy = SCHED_OTHER; + policy_str = "regular"; + sched.sched_priority = 0; + } + if (sched_setscheduler(getpid(), policy, &sched)) { + ast_log(LOG_WARNING, "Unable to set %s thread priority on main thread\n", policy_str); + return -1; + } + ast_verb(1, "Setting %s thread priority on all threads\n", policy_str); + AST_RWLIST_RDLOCK(&thread_list); + AST_RWLIST_TRAVERSE(&thread_list, cur, list) { + /* Don't care about the return value. It should work. */ + sched_setscheduler(cur->lwp, policy, &sched); + } + AST_RWLIST_UNLOCK(&thread_list); + return 0; +#endif +} + /*! \brief We set ourselves to a high priority, that we might pre-empt * everything else. If your PBX has heavy activity on it, this is a * good thing. @@ -3832,7 +3872,7 @@ static void *canary_thread(void *unused) "He's kicked the bucket. He's shuffled off his mortal coil, " "run down the curtain, and joined the bleeding choir invisible!! " "THIS is an EX-CANARY. (Reducing priority)\n"); - ast_set_priority(0); + set_priority_all(0); pthread_exit(NULL); } -- cgit v1.2.3