Cygwin: timerfd: prepare for TFD_TIMER_CANCEL_ON_SET
Also drop debugging sleep and make sure overrun count is positive. Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
This commit is contained in:
parent
3bfe18c643
commit
e32d1510da
|
@ -322,8 +322,6 @@ extern "C" int
|
||||||
timerfd_settime (int fd_in, int flags, const struct itimerspec *value,
|
timerfd_settime (int fd_in, int flags, const struct itimerspec *value,
|
||||||
struct itimerspec *ovalue)
|
struct itimerspec *ovalue)
|
||||||
{
|
{
|
||||||
/* TODO: There's no easy way to implement TFD_TIMER_CANCEL_ON_SET,
|
|
||||||
but we should at least accept the flag. */
|
|
||||||
if ((flags & ~(TFD_TIMER_ABSTIME | TFD_TIMER_CANCEL_ON_SET)) != 0)
|
if ((flags & ~(TFD_TIMER_ABSTIME | TFD_TIMER_CANCEL_ON_SET)) != 0)
|
||||||
{
|
{
|
||||||
set_errno (EINVAL);
|
set_errno (EINVAL);
|
||||||
|
|
|
@ -36,6 +36,7 @@ timerfd_tracker::thread_func ()
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Inner loop: Timer expired? If not, wait for it. */
|
/* Inner loop: Timer expired? If not, wait for it. */
|
||||||
|
/* TODO: TFD_TIMER_CANCEL_ON_SET */
|
||||||
HANDLE expired[3] = { tfd_shared->timer (),
|
HANDLE expired[3] = { tfd_shared->timer (),
|
||||||
tfd_shared->disarm_evt (),
|
tfd_shared->disarm_evt (),
|
||||||
cancel_evt };
|
cancel_evt };
|
||||||
|
@ -359,16 +360,21 @@ repeat:
|
||||||
{
|
{
|
||||||
ret = read_and_reset_overrun_count ();
|
ret = read_and_reset_overrun_count ();
|
||||||
leave_critical_section ();
|
leave_critical_section ();
|
||||||
if (ret)
|
switch (ret)
|
||||||
break;
|
|
||||||
/* A 0 overrun count indicates another read was quicker.
|
|
||||||
Continue as if we didn't catch the expiry. */
|
|
||||||
if (!nonblocking)
|
|
||||||
{
|
{
|
||||||
Sleep (100L);
|
case -1: /* TFD_TIMER_CANCEL_ON_SET */
|
||||||
goto repeat;
|
ret = -ECANCELED;
|
||||||
|
break;
|
||||||
|
case 0: /* Another read was quicker. */
|
||||||
|
if (!nonblocking)
|
||||||
|
goto repeat;
|
||||||
|
ret = -EAGAIN;
|
||||||
|
break;
|
||||||
|
default: /* Return (positive) overrun count. */
|
||||||
|
if (ret < 0)
|
||||||
|
ret = INT64_MAX;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
ret = -EAGAIN;
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case WAIT_OBJECT_0 + 1: /* signal */
|
case WAIT_OBJECT_0 + 1: /* signal */
|
||||||
|
|
Loading…
Reference in New Issue