mirror of
				https://github.com/asterisk/asterisk.git
				synced 2025-10-31 10:47:18 +00:00 
			
		
		
		
	Merge "asterisk.c: When astcanary dies on linux, reset priority on all threads."
This commit is contained in:
		| @@ -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); | ||||
| 		} | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user