sem.c

来自「ADS环境下的类似linux内核的操作系统」· C语言 代码 · 共 109 行

C
109
字号
/* MShowTec - www.mshowtec.com
** msLinux sem.c ver1.0
** 20051221 lmjx create limiao@mshowtec.com
** 
*/

#define MSLINUX_SEM_C

#include "errno.h"
#include "string.h"
#include "sem.h"

struct semaphore mslinux_sem_list[256];

void mslinux_semaphore_init()
{
	memset(mslinux_sem_list,0,(sizeof(struct semaphore)*MSLINUX_MAX_SEM_NUM));
}

int semaphore_init(short sem_num,short sem_max,short sem_init)
{
	int ret = 0;
	int irq_save = 0;
	
	irq_save = mslinux_save_disable_irq();
	
	if(sem_num>(MSLINUX_MAX_SEM_NUM-1)){
		ret = ESEMNOOUT;
		goto RET;
	}
	
	if(mslinux_sem_list[sem_num].sem_used){
		ret = ESEMINUSE;
		goto RET;
	}
	
	mslinux_sem_list[sem_num].sem_used = 1;
	mslinux_sem_list[sem_num].sem_max = sem_max;
	mslinux_sem_list[sem_num].sem_init = sem_init;
	mslinux_sem_list[sem_num].sem_val = sem_init;
	mslinux_sem_list[sem_num].sem_wait = 0;
	
RET:
	mslinux_restore_irq(irq_save);
	
	return ret;
}

int semaphore_take(short sem_num)	//P(s) ::=s:= s-1
{
	int ret = 0;
	int irq_save = 0;
	
	irq_save = mslinux_save_disable_irq();
	
	if(sem_num>(MSLINUX_MAX_SEM_NUM-1)){
		ret = -ESEMNOOUT;
		goto RET;
	}
	
	if(mslinux_sem_list[sem_num].sem_used == 0){
		ret = -ESEMNOTINIT;
		goto RET;
	}
	
	
	if(mslinux_sem_list[sem_num].sem_val > 0){	
		mslinux_sem_list[sem_num].sem_val--;	
		goto RET;	
	}
	
	while(1){
		if(mslinux_sem_list[sem_num].sem_val <= 0){
			mslinux_restore_irq(irq_save);
			sleep_on(&(mslinux_sem_list[sem_num].sem_wait));
			irq_save = mslinux_save_disable_irq();
		}else{
			mslinux_sem_list[sem_num].sem_val--;
			goto RET;
		}
	}
				
RET:
	mslinux_restore_irq(irq_save);	
	return ret;
		
}

int semaphore_give(short sem_num)	//V(s) ::=s:= s+1
{
	int irq_save = 0;
	
	irq_save = mslinux_save_disable_irq();
	
	mslinux_sem_list[sem_num].sem_val++;
	
	if(mslinux_sem_list[sem_num].sem_val > mslinux_sem_list[sem_num].sem_max)
		mslinux_sem_list[sem_num].sem_val = mslinux_sem_list[sem_num].sem_max;
		
	if(mslinux_sem_list[sem_num].sem_val > 0)	
		wake_up(&(mslinux_sem_list[sem_num].sem_wait));
	
	mslinux_restore_irq(irq_save);	
	
	return 0;
	
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?