📄 semaphore.c.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 + -