Files
svc.ems/plat/iptrans/src/ipcfunc.c
2024-09-27 15:39:34 +08:00

94 lines
2.1 KiB
C

/*
** CVS $Id: ipcfunc.c,v 1.4 2001/01/20 19:58:49 zhangsz Exp $
**
** ipcfunc.c
** created at 2000/12/20
** by Zhang SZ
**
** IPC functions for PACS-WLL project.
**
*/
#include "./include/iptrans.h"
/*@ignore@*/
void *
iptrShmInit(int shm_id, char *prog_name, key_t key, int size, int shmflg)
{
void *retp;
char *func_name = "ShmInit";
shm_id = shmget(key, size, shmflg);
if (shm_id == -1)
{
log_sys("%s: %s: shmget(key: %x)", prog_name, func_name, key);
return NULL;
}
retp = shmat(shm_id, (char *)0, 0);
if (retp == (void *) -1)
{
log_sys("%s: %s: shmat", prog_name, func_name);
return NULL;
}
return retp;
}
int
iptrSemInit(char *prog_name, key_t key, int sem_num, int sem_flg)
{
int initarray[sem_num];
int sem_id, retval, i;
char *func_name = "SemInit";
sem_id = semget(key, sem_num, sem_flg);
if (sem_id == -1)
log_sys("%s: %s: semget", prog_name, func_name);
for (i=0; i<sem_num; i++) {
initarray[i] = 1;
retval = semctl(sem_id, i, SETVAL, initarray[i]);
if (retval == -1)
log_sys("%s: %s: semctl", prog_name, func_name);
}
return sem_id;
}
BOOL
iptrSemLock(char *prog_name, int sem_id, int sem_num, unsigned nsops, int sem_flg)
{
int retval;
struct sembuf lock = {0, ACQUIRE, SEM_UNDO};
lock.sem_num = sem_num;
lock.sem_flg |= sem_flg;
retval = semop(sem_id, &lock, nsops);
if (retval == -1) {
// char *func_name = "SemLock";
// log_ret("%s: %s: semop(%d)", prog_name, func_name, sem_num);
return FAILURE;
}
return SUCCESS;
}
BOOL
iptrSemUnlock(char *prog_name, int sem_id, int sem_num, unsigned nsops, int sem_flg)
{
int retval;
struct sembuf unlock = {0, RELEASE, IPC_NOWAIT|SEM_UNDO};
unlock.sem_num = sem_num;
unlock.sem_flg |= sem_flg;
retval = semop(sem_id, &unlock, nsops);
if (retval == -1) {
// char *func_name = "SemUnlock";
// log_ret("%s: %s: semop(%d)", prog_name, func_name, sem_num);
return FAILURE;
}
return SUCCESS;
}
/*@end@*/