⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 semaphore.c.bak

📁 psos下采用linux的线程库时改写的那部分代码.
💻 BAK
字号:
/*************************************************
  Copyright (C), 2006-2010, Aurine
  File name: semaphore.c
  Author:	张卓谋
  Version:	1.0 
  Date:	  2005.6.02
  Description:  
  

*************************************************/


#include "semaphore.h"
#include <psos.h>
#include <stdio.h>

//#define DEBUG_OUTPUT 1

#ifdef DEBUG_OUTPUT
#define SM_PRINT	printf
#define SM_FPRINT	fprintf
#else
#define SM_PRINT	
#define SM_FPRINT	fprintf
#endif 

static int count = 0 ;
//----------------------------------------------------------------------------------------------------------
// 信号量初始化
//----------------------------------------------------------------------------------------------------------
int sem_init (sem_t * sem, int pshared, unsigned int value)
{	
	int ret = 0 ;
	
	memset(sem, 0, sizeof(sem_t)) ;
	
	ret = sm_create(NULL, value, SM_PRIOR, &sem->id) ;
	
	if (0 != ret)
	{
		SM_FPRINT(stderr, "[sem_init]: sm_create failed, count[%d] errno[0x%x]\n", count+1, errno) ;
		return ret ;
	}
	else 
	{
		count ++ ;
		SM_PRINT("[sem_init]: sm_create successfully, val[%d], count[%d]\n", value, count) ;
	}
		
	sem->count = value ;
	sem->valid = 1 ;
	
	
	return ret ;
}

//----------------------------------------------------------------------------------------------------------
// 等待信号量
//----------------------------------------------------------------------------------------------------------
int sem_wait (sem_t * sem)
{
	int ret = -1 ;
	
		
//	SM_PRINT("[sem_wait][0x%x]: sem_id[0x%x], before wait, count[%d]\n", pthread_self(), sem->id, sem->count) ;
	ret = sm_p(sem->id, SM_WAIT, 0) ;
	
	if (0 == ret) 
		sem->count -- ;
	else
		SM_FPRINT (stderr, "[sem_wait][0x%x]: sem_id[0x%x], sm_p failed, errno[0x%x]!\n", 
			pthread_self(), sem->id, errno);

	return ret ;
}

//----------------------------------------------------------------------------------------------------------
// 设置信号量
//----------------------------------------------------------------------------------------------------------
int sem_post (sem_t * sem)
{
	int ret = -1 ;

	
//	SM_PRINT("[sem_post][0x%x]: sem_id[0x%x], before post, count[%d]\n", pthread_self(), sem->id, sem->count) ;
	ret = sm_v(sem->id) ;
	
	if (0 == ret) 
		sem->count ++ ;
	else
		SM_FPRINT (stderr, "[sem_post][0x%x]: sem_id[0x%x], sm_v failed, errno[0x%x]!\n", 
			pthread_self(), sem->id, errno);
	
	return ret ;
}

//----------------------------------------------------------------------------------------------------------
// 获取信号量可用计数
//----------------------------------------------------------------------------------------------------------
int sem_getvalue (sem_t * sem, int *sval)
{
	int ret = 0 ;
	
	*sval = sem->count ;
	
	return ret ;
}

//----------------------------------------------------------------------------------------------------------
// 删除信号量
//----------------------------------------------------------------------------------------------------------
int sem_destroy (sem_t * sem)
{
	int ret ;
	
	ret = sm_delete(sem->id) ;
	if (0 == ret)
	{
		sem->valid = 0 ;
		count -- ;
	}
	else
	{
		SM_FPRINT (stderr, "[sem_destroy][0x%x]: sm[0x%x] delete failed, count[%d], errno[0x%x]\n", 
			pthread_self(), sem->id, count, errno) ;
	}
	
	memset(sem, 0, sizeof(sem_t)) ;
		
	return 0 ;
}

#undef SM_PRINT	
#undef SM_FPRINT



⌨️ 快捷键说明

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