diff options
author | Corinna Vinschen <corinna@vinschen.de> | 2019-01-16 00:11:03 +0100 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2019-01-16 12:53:56 +0100 |
commit | 89a99d3b580083818fa8d4117fd4916bf8a8fe00 (patch) | |
tree | e9f3ae7f03714df0ea0da1b2f9149de38d88174f | |
parent | 5b147c76d24f990c9fb7ab9617defe12c62dc2b2 (diff) | |
download | cygnal-89a99d3b580083818fa8d4117fd4916bf8a8fe00.tar.gz cygnal-89a99d3b580083818fa8d4117fd4916bf8a8fe00.tar.bz2 cygnal-89a99d3b580083818fa8d4117fd4916bf8a8fe00.zip |
Cygwin: posix timers: fix overrun computation
- Drop initial overrun computation from timer_tracker::settimer.
It's performed in timer_tracker::thread_func anyway.
- Fix regression in returning correct overrun count narrowed down to
int from timer_getoverrun. This has been introduced by changing
overrun_count_curr to LONG64.
Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
-rw-r--r-- | winsup/cygwin/timer.cc | 25 |
1 files changed, 8 insertions, 17 deletions
diff --git a/winsup/cygwin/timer.cc b/winsup/cygwin/timer.cc index 657407fe4..c429af6ee 100644 --- a/winsup/cygwin/timer.cc +++ b/winsup/cygwin/timer.cc @@ -369,22 +369,9 @@ timer_tracker::settime (int in_flags, const itimerspec *value, itimerspec *ovalu else { interval_us = timespec_to_us (value->it_interval); - if (in_flags & TIMER_ABSTIME) - { - int64_t now = get_clock (clock_id)->usecs (); - - sleepto_us = timespec_to_us (value->it_value); - if (sleepto_us <= now) - { - int64_t ov_cnt = (now - sleepto_us + (interval_us + 1)) - / interval_us; - InterlockedAdd64 (&overrun_count, ov_cnt); - sleepto_us += ov_cnt * interval_us; - } - } - else - sleepto_us = get_clock (clock_id)->usecs () - + timespec_to_us (value->it_value); + sleepto_us = timespec_to_us (value->it_value); + if (!(in_flags & TIMER_ABSTIME)) + sleepto_us += get_clock (clock_id)->usecs (); it_interval = value->it_interval; if (!hcancel) hcancel = CreateEvent (&sec_none_nih, TRUE, FALSE, NULL); @@ -564,7 +551,11 @@ timer_getoverrun (timer_t timerid) set_errno (EINVAL); __leave; } - ret = tt->getoverrun (); + LONG64 ov_cnt = tt->getoverrun (); + if (ov_cnt > DELAYTIMER_MAX || ov_cnt < 0) + ret = DELAYTIMER_MAX; + else + ret = ov_cnt; } __except (EFAULT) {} __endtry |