Revision 4a998740 qemu-timer.c
b/qemu-timer.c | ||
---|---|---|
153 | 153 |
struct QEMUClock { |
154 | 154 |
int type; |
155 | 155 |
int enabled; |
156 |
/* XXX: add frequency */ |
|
157 | 156 |
}; |
158 | 157 |
|
159 | 158 |
struct QEMUTimer { |
160 | 159 |
QEMUClock *clock; |
161 |
int64_t expire_time; |
|
160 |
int64_t expire_time; /* in nanoseconds */ |
|
161 |
int scale; |
|
162 | 162 |
QEMUTimerCB *cb; |
163 | 163 |
void *opaque; |
164 | 164 |
struct QEMUTimer *next; |
... | ... | |
386 | 386 |
clock->enabled = enabled; |
387 | 387 |
} |
388 | 388 |
|
389 |
QEMUTimer *qemu_new_timer(QEMUClock *clock, QEMUTimerCB *cb, void *opaque) |
|
389 |
QEMUTimer *qemu_new_timer(QEMUClock *clock, int scale, |
|
390 |
QEMUTimerCB *cb, void *opaque) |
|
390 | 391 |
{ |
391 | 392 |
QEMUTimer *ts; |
392 | 393 |
|
... | ... | |
394 | 395 |
ts->clock = clock; |
395 | 396 |
ts->cb = cb; |
396 | 397 |
ts->opaque = opaque; |
398 |
ts->scale = scale; |
|
397 | 399 |
return ts; |
398 | 400 |
} |
399 | 401 |
|
... | ... | |
424 | 426 |
|
425 | 427 |
/* modify the current timer so that it will be fired when current_time |
426 | 428 |
>= expire_time. The corresponding callback will be called. */ |
427 |
void qemu_mod_timer(QEMUTimer *ts, int64_t expire_time)
|
|
429 |
static void qemu_mod_timer_ns(QEMUTimer *ts, int64_t expire_time)
|
|
428 | 430 |
{ |
429 | 431 |
QEMUTimer **pt, *t; |
430 | 432 |
|
... | ... | |
457 | 459 |
} |
458 | 460 |
} |
459 | 461 |
|
462 |
/* modify the current timer so that it will be fired when current_time |
|
463 |
>= expire_time. The corresponding callback will be called. */ |
|
464 |
void qemu_mod_timer(QEMUTimer *ts, int64_t expire_time) |
|
465 |
{ |
|
466 |
qemu_mod_timer_ns(ts, expire_time * ts->scale); |
|
467 |
} |
|
468 |
|
|
460 | 469 |
int qemu_timer_pending(QEMUTimer *ts) |
461 | 470 |
{ |
462 | 471 |
QEMUTimer *t; |
... | ... | |
471 | 480 |
{ |
472 | 481 |
if (!timer_head) |
473 | 482 |
return 0; |
474 |
return (timer_head->expire_time <= current_time); |
|
483 |
return (timer_head->expire_time <= current_time * timer_head->scale);
|
|
475 | 484 |
} |
476 | 485 |
|
477 | 486 |
static void qemu_run_timers(QEMUClock *clock) |
... | ... | |
482 | 491 |
if (!clock->enabled) |
483 | 492 |
return; |
484 | 493 |
|
485 |
current_time = qemu_get_clock (clock);
|
|
494 |
current_time = qemu_get_clock_ns(clock);
|
|
486 | 495 |
ptimer_head = &active_timers[clock->type]; |
487 | 496 |
for(;;) { |
488 | 497 |
ts = *ptimer_head; |
... | ... | |
559 | 568 |
|
560 | 569 |
expire_time = qemu_get_be64(f); |
561 | 570 |
if (expire_time != -1) { |
562 |
qemu_mod_timer(ts, expire_time); |
|
571 |
qemu_mod_timer_ns(ts, expire_time);
|
|
563 | 572 |
} else { |
564 | 573 |
qemu_del_timer(ts); |
565 | 574 |
} |
... | ... | |
717 | 726 |
delta = hdelta; |
718 | 727 |
} |
719 | 728 |
if (active_timers[QEMU_CLOCK_REALTIME]) { |
720 |
rtdelta = (active_timers[QEMU_CLOCK_REALTIME]->expire_time * 1000000 -
|
|
729 |
rtdelta = (active_timers[QEMU_CLOCK_REALTIME]->expire_time - |
|
721 | 730 |
qemu_get_clock_ns(rt_clock)); |
722 | 731 |
if (rtdelta < delta) |
723 | 732 |
delta = rtdelta; |
Also available in: Unified diff