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


#include"kernel.h" 
void move_semaphore(int semaphore_id,int destination_process) 
{ 
	int front,back; 
	struct process *p; 
	struct semaphore *s; 
 
	s=&(os->semaphore[semaphore_id]); 
	p=&(os->process[s->process]); 
	p->semaphore_number--; 
	if(p->semaphore_ring==semaphore_id) 
		p->semaphore_ring=s->back; 
	if(p->semaphore_ring==semaphore_id) 
		p->semaphore_ring=-1; 
	else{ 
		front=s->front; 
		back=s->back; 
		os->semaphore[front].back=back; 
		os->semaphore[back].front=front; 
	} 
 
	p=&(os->process[destination_process]); 
	p->semaphore_number++; 
	if(p->semaphore_ring==-1){ 
			p->semaphore_ring=semaphore_id;	 
			s->front=semaphore_id; 
			s->back=semaphore_id; 
		} 
	else{ 
		front=p->semaphore_ring; 
		back=os->semaphore[front].back; 
		os->semaphore[semaphore_id].front=front; 
		os->semaphore[semaphore_id].back=back; 
		os->semaphore[front].back=semaphore_id; 
		os->semaphore[back].front=semaphore_id; 
	} 
	s->process=destination_process; 
	return; 
}