]> xenbits.xensource.com Git - rumpuser-xen.git/commitdiff
Use 64bit values for minios sched sleeps
authorAntti Kantee <pooka@iki.fi>
Tue, 13 Jan 2015 00:42:27 +0000 (01:42 +0100)
committerAntti Kantee <pooka@iki.fi>
Tue, 13 Jan 2015 00:42:27 +0000 (01:42 +0100)
fixes issues when current _wall_ time in msecs cannot be held in
32bit uint (well, uptime too, but that didn't happen quite a quickly)

lib/_lwp.c
xen/include/mini-os/sched.h
xen/sched.c

index 9bf185f30722c260fad3386760542a375f4bf703..2f7671c9f9e14d173aa8a55c2799bf20806bad73 100644 (file)
@@ -177,7 +177,7 @@ ___lwp_park60(clockid_t clock_id, int flags, const struct timespec *ts,
                _lwp_unpark(unpark, unparkhint);
 
        if (ts) {
-               uint32_t msecs = ts->tv_sec*1000 + ts->tv_nsec/(1000*1000);
+               uint64_t msecs = ts->tv_sec*1000 + ts->tv_nsec/(1000*1000);
                
                if (flags & TIMER_ABSTIME) {
                        rv = minios_absmsleep(msecs);
index 3038364eb1740187be8ae17365d24b99cec2a7cd..4436cc80ebfb4b859cbe0fe2d135a348624eec5f 100644 (file)
@@ -52,7 +52,7 @@ void minios_schedule(void);
 
 void minios_wake(struct thread *thread);
 void minios_block(struct thread *thread);
-int minios_msleep(uint32_t millisecs);
-int minios_absmsleep(uint32_t millisecs);
+int minios_msleep(uint64_t millisecs);
+int minios_absmsleep(uint64_t millisecs);
 
 #endif /* __MINIOS_SCHED_H__ */
index 9d2dfd729ec8bb5d3c0f65af71b186c9d5f9a584..5293ec238d1539f4850362a80e4fa71f184231f8 100644 (file)
@@ -262,16 +262,22 @@ dosleep(s_time_t wakeuptime)
     return rv;
 }
 
-int minios_msleep(uint32_t millisecs)
+int minios_msleep(uint64_t millisecs)
 {
 
     return dosleep(NOW() + MILLISECS(millisecs));
 }
 
-int minios_absmsleep(uint32_t millisecs)
+int minios_absmsleep(uint64_t millisecs)
 {
+    uint32_t secs;
+    uint64_t nsecs;
 
-    return dosleep(MILLISECS(millisecs));
+    /* oh the silliness! */
+    minios_clock_wall(&secs, &nsecs);
+    millisecs -= 1000ULL*(uint64_t)secs + nsecs/(1000ULL*1000);
+
+    return dosleep(MILLISECS(millisecs) + NOW());
 }
 
 void minios_wake(struct thread *thread)