fis-gtm/sr_unix/do_semop.c

47 lines
1.2 KiB
C

/****************************************************************
* *
* Copyright 2001, 2012 Fidelity Information Services, Inc *
* *
* This source code contains the intellectual property *
* of its copyright holder(s), and is made available *
* under a license. If you do not know the terms of *
* the license, please stop and do not read further. *
* *
****************************************************************/
#include "mdef.h"
#include <errno.h>
#include <sys/sem.h>
#include "gtm_stdlib.h"
#include "gtm_ipc.h"
#include "gtm_fcntl.h"
#include "do_semop.h"
#include "gtm_c_stack_trace.h"
#include "gtm_c_stack_trace_semop.h"
/* perform one semop, returning errno if it was unsuccessful */
int do_semop(int sems, int num, int op, int flg)
{
static struct sembuf sop[1];
int rv = -1;
boolean_t wait_option;
wait_option = ((!(flg & IPC_NOWAIT)) && (0 == op));
sop[0].sem_num = num;
sop[0].sem_op = op;
sop[0].sem_flg = flg;
CHECK_SEMVAL_GRT_SEMOP(sems, num, op);
if (wait_option)
{
rv = try_semop_get_c_stack(sems, sop, 1);
return rv;
} else
{
while (-1 == (rv = semop(sems, sop, 1)) && EINTR == errno)
;
return (-1 == rv) ? errno : 0;
}
}