|
|
|
|
|
|
|
|
|
|
xen-devel
[Xen-devel] [PATCH] replacing gettimeofday with clock_gettime in hw/seri
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 <=
|
|
|
|
|