Cygwin: rearrange sigwait functions, convert sigwait_common to inline

Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
This commit is contained in:
Corinna Vinschen 2017-12-18 19:44:30 +01:00
parent 24ff42d79a
commit 7af691a784
1 changed files with 43 additions and 45 deletions

View File

@ -575,51 +575,7 @@ siginterrupt (int sig, int flag)
return res; return res;
} }
static int sigwait_common (const sigset_t *, siginfo_t *, PLARGE_INTEGER); static inline int
extern "C" int
sigtimedwait (const sigset_t *set, siginfo_t *info, const timespec *timeout)
{
LARGE_INTEGER waittime;
if (timeout)
{
if (timeout->tv_sec < 0
|| timeout->tv_nsec < 0 || timeout->tv_nsec > (NSPERSEC * 100LL))
{
set_errno (EINVAL);
return -1;
}
/* convert timespec to 100ns units */
waittime.QuadPart = (LONGLONG) timeout->tv_sec * NSPERSEC
+ ((LONGLONG) timeout->tv_nsec + 99LL) / 100LL;
}
return sigwait_common (set, info, timeout ? &waittime : cw_infinite);
}
extern "C" int
sigwait (const sigset_t *set, int *sig_ptr)
{
int sig;
do
{
sig = sigwait_common (set, NULL, cw_infinite);
}
while (sig == -1 && get_errno () == EINTR);
if (sig > 0)
*sig_ptr = sig;
return sig > 0 ? 0 : get_errno ();
}
extern "C" int
sigwaitinfo (const sigset_t *set, siginfo_t *info)
{
return sigwait_common (set, info, cw_infinite);
}
static int
sigwait_common (const sigset_t *set, siginfo_t *info, PLARGE_INTEGER waittime) sigwait_common (const sigset_t *set, siginfo_t *info, PLARGE_INTEGER waittime)
{ {
int res = -1; int res = -1;
@ -664,6 +620,48 @@ sigwait_common (const sigset_t *set, siginfo_t *info, PLARGE_INTEGER waittime)
return res; return res;
} }
extern "C" int
sigtimedwait (const sigset_t *set, siginfo_t *info, const timespec *timeout)
{
LARGE_INTEGER waittime;
if (timeout)
{
if (timeout->tv_sec < 0
|| timeout->tv_nsec < 0 || timeout->tv_nsec > (NSPERSEC * 100LL))
{
set_errno (EINVAL);
return -1;
}
/* convert timespec to 100ns units */
waittime.QuadPart = (LONGLONG) timeout->tv_sec * NSPERSEC
+ ((LONGLONG) timeout->tv_nsec + 99LL) / 100LL;
}
return sigwait_common (set, info, timeout ? &waittime : cw_infinite);
}
extern "C" int
sigwait (const sigset_t *set, int *sig_ptr)
{
int sig;
do
{
sig = sigwait_common (set, NULL, cw_infinite);
}
while (sig == -1 && get_errno () == EINTR);
if (sig > 0)
*sig_ptr = sig;
return sig > 0 ? 0 : get_errno ();
}
extern "C" int
sigwaitinfo (const sigset_t *set, siginfo_t *info)
{
return sigwait_common (set, info, cw_infinite);
}
/* FIXME: SUSv3 says that this function should block until the signal has /* FIXME: SUSv3 says that this function should block until the signal has
actually been delivered. Currently, this will only happen when sending actually been delivered. Currently, this will only happen when sending
signals to the current process. It will not happen when sending signals signals to the current process. It will not happen when sending signals