Merge "asterisk.c: When astcanary dies on linux, reset priority on all threads." into 14

changes/21/3921/2
zuul 9 years ago committed by Gerrit Code Review
commit b56717b396

@ -1778,6 +1778,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.
@ -3744,7 +3784,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);
}

Loading…
Cancel
Save