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