www.pudn.com > LFYOS.zip > modify_pri.c


#include"kernel.h" 
 
void modify_thread_priority(int thread_id,int new_priority) 
{ 
	int ready_id,run_id; 
	struct thread *t,*ready_t,*run_t; 
 
	if((thread_id<0)||(thread_id>=THREAD_NUMBER)) 
		return; 
	t=&(os->thread[thread_id]); 
	switch(t->state){ 
	case READY: 
		if(os->thread_heap.run_thread_number>0){ 
			run_id=os->thread_heap.run_heap[0].thread; 
			run_t=&(os->thread[run_id]); 
			if(new_prioritypriority){ 
				remove_from_heap(thread_id); 
				t->priority=new_priority; 
				insert_into_heap(thread_id); 
				break; 
			} 
		} 
		if(new_priority>t->priority){ 
			t->priority=new_priority; 
			ready_heap_down_deal(thread_id); 
			break; 
		} 
		 if(new_prioritypriority){ 
			t->priority=new_priority; 
			ready_heap_up_deal(thread_id); 
			break; 
		} 
		break; 
	case RUN: 
		if(os->thread_heap.ready_thread_number>0){ 
			ready_id=os->thread_heap.ready_heap[0].thread; 
			ready_t=&(os->thread[ready_id]); 
			if(new_priority>ready_t->priority){ 
				remove_from_heap(thread_id); 
				t->priority=new_priority; 
				insert_into_heap(thread_id); 
				break; 
			} 
		} 
		if(new_priority>t->priority){ 
			t->priority=new_priority; 
			run_heap_up_deal(thread_id); 
			break; 
		} 
		if(new_prioritypriority){ 
			t->priority=new_priority; 
			run_heap_down_deal(thread_id); 
			break; 
		} 
		break; 
	default: 
		t->priority=new_priority; 
		break; 
	} 
	return; 
}