diff options
author | Corinna Vinschen <corinna@vinschen.de> | 2019-01-21 22:52:39 +0100 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2019-01-21 22:52:39 +0100 |
commit | 5b23a8e83112548d4c06e2f4b46aa20bd38d26d5 (patch) | |
tree | 5f6f603ae8063e6cc5e23a06633cfe3344940240 | |
parent | 289b7c09c8bca6c84edfddf77c11b530bda95016 (diff) | |
download | cygnal-5b23a8e83112548d4c06e2f4b46aa20bd38d26d5.tar.gz cygnal-5b23a8e83112548d4c06e2f4b46aa20bd38d26d5.tar.bz2 cygnal-5b23a8e83112548d4c06e2f4b46aa20bd38d26d5.zip |
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 <corinna@vinschen.de>
-rw-r--r-- | winsup/cygwin/timerfd.cc | 29 |
1 files changed, 22 insertions, 7 deletions
diff --git a/winsup/cygwin/timerfd.cc b/winsup/cygwin/timerfd.cc index a03749a60..295716f46 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 */ |