public inbox for cygwin-cvs@sourceware.org
help / color / mirror / Atom feed
* [newlib-cygwin] Cygwin: timerfd: prepare for TFD_TIMER_CANCEL_ON_SET
@ 2019-01-19 19:54 Corinna Vinschen
0 siblings, 0 replies; only message in thread
From: Corinna Vinschen @ 2019-01-19 19:54 UTC (permalink / raw)
To: cygwin-cvs
https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;h=e32d1510da0f943dc4631bce3d49d85d156f78bd
commit e32d1510da0f943dc4631bce3d49d85d156f78bd
Author: Corinna Vinschen <corinna@vinschen.de>
Date: Sat Jan 19 20:53:38 2019 +0100
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>
Diff:
---
winsup/cygwin/fhandler_timerfd.cc | 2 --
winsup/cygwin/timerfd.cc | 22 ++++++++++++++--------
2 files changed, 14 insertions(+), 10 deletions(-)
diff --git a/winsup/cygwin/fhandler_timerfd.cc b/winsup/cygwin/fhandler_timerfd.cc
index 8d30856..33829ed 100644
--- a/winsup/cygwin/fhandler_timerfd.cc
+++ b/winsup/cygwin/fhandler_timerfd.cc
@@ -322,8 +322,6 @@ extern "C" int
timerfd_settime (int fd_in, int flags, const struct itimerspec *value,
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)
{
set_errno (EINVAL);
diff --git a/winsup/cygwin/timerfd.cc b/winsup/cygwin/timerfd.cc
index 145f3a6..ae26004 100644
--- a/winsup/cygwin/timerfd.cc
+++ b/winsup/cygwin/timerfd.cc
@@ -36,6 +36,7 @@ timerfd_tracker::thread_func ()
}
/* Inner loop: Timer expired? If not, wait for it. */
+ /* TODO: TFD_TIMER_CANCEL_ON_SET */
HANDLE expired[3] = { tfd_shared->timer (),
tfd_shared->disarm_evt (),
cancel_evt };
@@ -359,16 +360,21 @@ repeat:
{
ret = read_and_reset_overrun_count ();
leave_critical_section ();
- if (ret)
- break;
- /* A 0 overrun count indicates another read was quicker.
- Continue as if we didn't catch the expiry. */
- if (!nonblocking)
+ switch (ret)
{
- Sleep (100L);
- goto repeat;
+ case -1: /* TFD_TIMER_CANCEL_ON_SET */
+ 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;
case WAIT_OBJECT_0 + 1: /* signal */
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2019-01-19 19:54 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-01-19 19:54 [newlib-cygwin] Cygwin: timerfd: prepare for TFD_TIMER_CANCEL_ON_SET Corinna Vinschen
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).