Stefano Stabellini
2008-Jul-30 10:04 UTC
[Xen-devel] [PATCH] replacing gettimeofday with clock_gettime in hw/serial
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@eu.citrix.com> --- 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@lists.xensource.com http://lists.xensource.com/xen-devel