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


#include"kernel.h" 
 
void remove_from_heap(int thread_id) 
{ 
	int s,t_run,h_run,t_ready,h_ready; 
 
	if((s=os->thread[thread_id].state)==READY){ 
		remove_from_ready_heap(thread_id); 
		os->thread[thread_id].state=SLEEP; 
		return; 
	} 
 
	if(s!=RUN) 
		return; 
 
	if(os->thread_heap.ready_thread_number<=0){ 
		remove_from_run_heap(thread_id); 
		os->thread[thread_id].state=SLEEP; 
		left_run_state(thread_id); 
		return; 
	} 
 
	t_run=thread_id; 
	h_run=os->thread[t_run].heap; 
 
	t_ready=os->thread_heap.ready_heap[0].thread; 
	h_ready=0; 
	 
	os->thread_heap.run_heap[h_run].thread=t_ready; 
	os->thread_heap.ready_heap[h_ready].thread=t_run; 
	 
	os->thread[t_run].heap=h_ready; 
	os->thread[t_run].state=READY; 
	 
	os->thread[t_ready].heap=h_run; 
	os->thread[t_ready].state=RUN; 
	 
	run_heap_up_deal(t_ready); 
	remove_from_ready_heap(t_run); 
 
	os->thread[thread_id].state=SLEEP; 
 
	left_run_state(t_run); 
 
	enter_run_state(t_ready); 
	 
	return; 
} 
		 
void insert_into_heap(int thread_id) 
{ 
	int t,t_run,p,p_run; 
	 
	t=thread_id; 
	if(os->thread[t].state!=SLEEP) 
		return;	 
	if(os->thread_heap.run_thread_numberthread[t].state=RUN; 
		insert_into_run_heap(t); 
		enter_run_state(t); 
		return; 
	} 
	 
	p=os->thread[t].priority; 
	t_run=os->thread_heap.run_heap[0].thread; 
	p_run=os->thread[t_run].priority; 
 
	if(p>=p_run){ 
		os->thread[thread_id].state=READY;  
		insert_into_ready_heap(t); 
		return; 
	} 
		 
	os->thread[t].state=RUN; 
	os->thread[t].heap=0; 
	os->thread_heap.run_heap[0].thread=t; 
	run_heap_down_deal(t); 
 
	os->thread[t_run].state=READY;  
	insert_into_ready_heap(t_run); 
 
	left_run_state(t_run); 
	enter_run_state(t); 
 
	return; 
}