47 lines
1.2 KiB
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;
|
|
}
|
|
}
|