From 89a99d3b580083818fa8d4117fd4916bf8a8fe00 Mon Sep 17 00:00:00 2001 From: Corinna Vinschen Date: Wed, 16 Jan 2019 00:11:03 +0100 Subject: [PATCH] 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 --- winsup/cygwin/timer.cc | 25 ++++++++----------------- 1 file 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