From eb37787bb2fcda1cf34b72191d0b94d1a61a6b26 Mon Sep 17 00:00:00 2001 From: Nadav Har'El <nyh@cloudius-systems.com> Date: Sun, 26 Jan 2014 15:35:22 +0200 Subject: [PATCH] clock: Use new clock APIs in alarm() implementation Change alarm() implementation to use the new <osv/clock.hh> APIs and the monotonic clock. Reviewed-by: Glauber Costa <glommer@cloudius-systems.com> Signed-off-by: Nadav Har'El <nyh@cloudius-systems.com> Signed-off-by: Pekka Enberg <penberg@cloudius-systems.com> --- libc/signal.cc | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/libc/signal.cc b/libc/signal.cc index 6dacede62..603d56d6d 100644 --- a/libc/signal.cc +++ b/libc/signal.cc @@ -15,10 +15,12 @@ #include <osv/mutex.h> #include <osv/condvar.h> #include <osv/power.hh> -#include <drivers/clock.hh> +#include <osv/clock.hh> #include <api/setjmp.h> #include <osv/stubbing.hh> +using namespace osv::clock::literals; + namespace osv { // we can't use have __thread sigset because of the constructor @@ -245,18 +247,19 @@ static mutex alarm_mutex; static condvar alarm_cond; static sched::thread *alarm_thread = nullptr; static sched::thread *owner_thread = nullptr; -static s64 alarm_due = 0; +static constexpr osv::clock::uptime::time_point no_alarm {}; +static osv::clock::uptime::time_point alarm_due = no_alarm; void alarm_thread_func() { sched::timer tmr(*sched::thread::current()); while (true) { WITH_LOCK(alarm_mutex) { - if (alarm_due != 0) { + if (alarm_due != no_alarm) { tmr.set(alarm_due); alarm_cond.wait(alarm_mutex, &tmr); if (tmr.expired()) { - alarm_due = 0; + alarm_due = no_alarm; kill(0, SIGALRM); if(!is_sig_ign(signal_actions[SIGALRM])) { owner_thread->interrupted(true); @@ -273,12 +276,12 @@ void alarm_thread_func() static void cancel_alarm_ll() { - alarm_due = 0; + alarm_due = no_alarm; owner_thread = nullptr; alarm_cond.wake_one(); } -static void set_alarm_ll(s64 new_alarm_due) +static void set_alarm_ll(decltype(alarm_due) new_alarm_due) { alarm_due = new_alarm_due; owner_thread = sched::thread::current(); @@ -304,8 +307,8 @@ unsigned int alarm(unsigned int seconds) alarm_thread = new sched::thread(alarm_thread_func); alarm_thread->start(); } - s64 now = nanotime(); - if (alarm_due) { + auto now = osv::clock::uptime::now(); + if (alarm_due != no_alarm) { ret = (alarm_due - now) / 1_s; } if (seconds) { -- GitLab