From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 15700 invoked by alias); 21 Jan 2019 21:54:48 -0000 Mailing-List: contact cygwin-cvs-help@cygwin.com; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Post: List-Help: , Sender: cygwin-cvs-owner@cygwin.com Received: (qmail 15654 invoked by uid 9078); 21 Jan 2019 21:54:48 -0000 Date: Mon, 21 Jan 2019 21:54:00 -0000 Message-ID: <20190121215448.15652.qmail@sourceware.org> Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: Corinna Vinschen To: cygwin-cvs@sourceware.org Subject: [newlib-cygwin] Cygwin: timerfd: fix gettime X-Act-Checkin: newlib-cygwin X-Git-Author: Corinna Vinschen X-Git-Refname: refs/heads/master X-Git-Oldrev: 289b7c09c8bca6c84edfddf77c11b530bda95016 X-Git-Newrev: 5b23a8e83112548d4c06e2f4b46aa20bd38d26d5 X-SW-Source: 2019-q1/txt/msg00081.txt.bz2 https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;h=5b23a8e83112548d4c06e2f4b46aa20bd38d26d5 commit 5b23a8e83112548d4c06e2f4b46aa20bd38d26d5 Author: Corinna Vinschen Date: Mon Jan 21 22:52:39 2019 +0100 Cygwin: timerfd: fix gettime - split into to __try/__except blocks to make sure leave_critical_section is always called when required. - Actually fill time_spec in settime so it_interval is returned correctly. - Return all 0 if timer is disarmed. Signed-off-by: Corinna Vinschen Diff: --- winsup/cygwin/timerfd.cc | 29 ++++++++++++++++++++++------- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/winsup/cygwin/timerfd.cc b/winsup/cygwin/timerfd.cc index a03749a..295716f 100644 --- a/winsup/cygwin/timerfd.cc +++ b/winsup/cygwin/timerfd.cc @@ -502,13 +502,26 @@ timerfd_tracker::gettime (struct itimerspec *curr_value) ret = -EBADF; __leave; } - LONG64 next_relative_exp = get_exp_ts () - get_clock_now (); - curr_value->it_value.tv_sec = next_relative_exp / NS100PERSEC; - next_relative_exp -= curr_value->it_value.tv_sec * NS100PERSEC; - curr_value->it_value.tv_nsec = next_relative_exp - * (NSPERSEC / NS100PERSEC); - curr_value->it_interval = time_spec ().it_interval; - leave_critical_section (); + } + __except (NO_ERROR) + { + return -EFAULT; + } + __endtry + + __try + { + if (IsEventSignalled (tfd_shared->disarm_evt ())) + *curr_value = time_spec (); + else + { + LONG64 next_relative_exp = get_exp_ts () - get_clock_now (); + curr_value->it_value.tv_sec = next_relative_exp / NS100PERSEC; + next_relative_exp -= curr_value->it_value.tv_sec * NS100PERSEC; + curr_value->it_value.tv_nsec = next_relative_exp + * (NSPERSEC / NS100PERSEC); + curr_value->it_interval = time_spec ().it_interval; + } ret = 0; } __except (NO_ERROR) @@ -516,6 +529,7 @@ timerfd_tracker::gettime (struct itimerspec *curr_value) ret = -EFAULT; } __endtry + leave_critical_section (); return ret; } @@ -559,6 +573,7 @@ timerfd_shared::arm_timer (int flags, const struct itimerspec *new_value) ts += get_clock_now (); } set_exp_ts (ts); + time_spec () = *new_value; /* TODO: CLOCK_REALTIME_ALARM / CLOCK_BOOTTIME_ALARM Note: Advanced Power Settings -> Sleep -> Allow Wake Timers since W10 1709 */