WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-devel

[Xen-devel] [PATCH] replacing gettimeofday with clock_gettime in hw/seri

To: xen-devel@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-devel] [PATCH] replacing gettimeofday with clock_gettime in hw/serial
From: Stefano Stabellini <stefano.stabellini@xxxxxxxxxxxxx>
Date: Wed, 30 Jul 2008 11:04:36 +0100
Delivery-date: Wed, 30 Jul 2008 03:03:58 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-id: Xen developer discussion <xen-devel.lists.xensource.com>
List-post: <mailto:xen-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
Sender: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx
User-agent: Thunderbird 2.0.0.14 (X11/20080505)
This patch substitutes gettimeofday with clock_gettime in hw/serial.c.

The use of gettimeofday in serial is not nearly as dangerous as in
xenconsoled, but it is still worth fixing it.

Signed-off-by: Stefano Stabellini <stefano.stabellini@xxxxxxxxxxxxx>

---

diff --git a/hw/serial.c b/hw/serial.c
index d49b5de..6ae3b20 100644
--- a/hw/serial.c
+++ b/hw/serial.c
@@ -155,8 +155,8 @@ struct SerialState {
    doesn't kill dom0.  Simple token bucket.  If we get some actual
    data from the user, instantly refil the bucket. */
 
-/* How long it takes to generate a token, in microseconds. */
-#define TOKEN_PERIOD 1000
+/* How long it takes to generate a token, in nanoseconds. */
+#define TOKEN_PERIOD 1000000
 /* Maximum and initial size of token bucket */
 #define TOKENS_MAX 100000
 
@@ -279,47 +279,47 @@ static void serial_update_parameters(SerialState *s)
 
 static void serial_get_token(void)
 {
-    static struct timeval last_refil_time;
+    static struct timespec last_refil_time;
     static int started;
 
     assert(tokens_avail >= 0);
     if (!tokens_avail) {
-       struct timeval delta, now;
-       int generated;
+       struct timespec delta, now;
+       long generated;
 
        if (!started) {
-           gettimeofday(&last_refil_time, NULL);
+           clock_gettime(CLOCK_MONOTONIC, &last_refil_time);
            tokens_avail = TOKENS_MAX;
            started = 1;
            return;
        }
     retry:
-       gettimeofday(&now, NULL);
+       clock_gettime(CLOCK_MONOTONIC, &now);
        delta.tv_sec = now.tv_sec - last_refil_time.tv_sec;
-       delta.tv_usec = now.tv_usec - last_refil_time.tv_usec;
-       if (delta.tv_usec < 0) {
-           delta.tv_usec += 1000000;
+       delta.tv_nsec = now.tv_nsec - last_refil_time.tv_nsec;
+       if (delta.tv_nsec < 0) {
+           delta.tv_nsec += 1000000000;
            delta.tv_sec--;
        }
-       assert(delta.tv_usec >= 0 && delta.tv_sec >= 0);
-       if (delta.tv_usec < TOKEN_PERIOD) {
+       assert(delta.tv_nsec >= 0 && delta.tv_sec >= 0);
+       if (delta.tv_nsec < TOKEN_PERIOD) {
            struct timespec ts;
            /* Wait until at least one token is available. */
-           ts.tv_sec = TOKEN_PERIOD / 1000000;
-           ts.tv_nsec = (TOKEN_PERIOD % 1000000) * 1000;
+           ts.tv_sec = TOKEN_PERIOD / 1000000000;
+           ts.tv_nsec = TOKEN_PERIOD % 1000000000;
            while (nanosleep(&ts, &ts) < 0 && errno == EINTR)
                ;
            goto retry;
        }
-       generated = (delta.tv_sec * 1000000) / TOKEN_PERIOD;
+       generated = (delta.tv_sec * 1000000000) / TOKEN_PERIOD;
        generated +=
-           ((delta.tv_sec * 1000000) % TOKEN_PERIOD + delta.tv_usec) / 
TOKEN_PERIOD;
+           ((delta.tv_sec * 1000000000) % TOKEN_PERIOD + delta.tv_nsec) / 
TOKEN_PERIOD;
        assert(generated > 0);
 
-       last_refil_time.tv_usec += (generated * TOKEN_PERIOD) % 1000000;
-       last_refil_time.tv_sec  += last_refil_time.tv_usec / 1000000;
-       last_refil_time.tv_usec %= 1000000;
-       last_refil_time.tv_sec  += (generated * TOKEN_PERIOD) / 1000000;
+       last_refil_time.tv_nsec += (generated * TOKEN_PERIOD) % 1000000000;
+       last_refil_time.tv_sec  += last_refil_time.tv_nsec / 1000000000;
+       last_refil_time.tv_nsec %= 1000000000;
+        last_refil_time.tv_sec  += (generated * TOKEN_PERIOD) / 1000000000;
        if (generated > TOKENS_MAX)
            generated = TOKENS_MAX;
        tokens_avail = generated;

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel

<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-devel] [PATCH] replacing gettimeofday with clock_gettime in hw/serial, Stefano Stabellini <=