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:
Corinna Vinschen 2019-01-19 20:53:38 +01:00
parent 3bfe18c643
commit e32d1510da
2 changed files with 14 additions and 10 deletions

View File

@ -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);

View File

@ -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 */