Revision 84682834 qemu-timer.c

b/qemu-timer.c
218 218

  
219 219
static int unix_start_timer(struct qemu_alarm_timer *t);
220 220
static void unix_stop_timer(struct qemu_alarm_timer *t);
221
static void unix_rearm_timer(struct qemu_alarm_timer *t);
221 222

  
222 223
#ifdef __linux__
223 224

  
......
290 291
    {"dynticks", dynticks_start_timer,
291 292
     dynticks_stop_timer, dynticks_rearm_timer},
292 293
#endif
293
    {"unix", unix_start_timer, unix_stop_timer, NULL},
294
    {"unix", unix_start_timer, unix_stop_timer, unix_rearm_timer},
294 295
#else
295 296
    {"mmtimer", mm_start_timer, mm_stop_timer, NULL},
296 297
    {"mmtimer2", mm_start_timer, mm_stop_timer, mm_rearm_timer},
......
890 891
static int unix_start_timer(struct qemu_alarm_timer *t)
891 892
{
892 893
    struct sigaction act;
893
    struct itimerval itv;
894
    int err;
895 894

  
896 895
    /* timer signal */
897 896
    sigfillset(&act.sa_mask);
......
899 898
    act.sa_handler = host_alarm_handler;
900 899

  
901 900
    sigaction(SIGALRM, &act, NULL);
901
    return 0;
902
}
902 903

  
903
    itv.it_interval.tv_sec = 0;
904
    /* for i386 kernel 2.6 to get 1 ms */
905
    itv.it_interval.tv_usec = 999;
906
    itv.it_value.tv_sec = 0;
907
    itv.it_value.tv_usec = 10 * 1000;
904
static void unix_rearm_timer(struct qemu_alarm_timer *t)
905
{
906
    struct itimerval itv;
907
    int64_t nearest_delta_ns = INT64_MAX;
908
    int err;
908 909

  
909
    err = setitimer(ITIMER_REAL, &itv, NULL);
910
    if (err)
911
        return -1;
910
    assert(alarm_has_dynticks(t));
911
    if (!active_timers[QEMU_CLOCK_REALTIME] &&
912
        !active_timers[QEMU_CLOCK_VIRTUAL] &&
913
        !active_timers[QEMU_CLOCK_HOST])
914
        return;
912 915

  
913
    return 0;
916
    nearest_delta_ns = qemu_next_alarm_deadline();
917
    if (nearest_delta_ns < MIN_TIMER_REARM_NS)
918
        nearest_delta_ns = MIN_TIMER_REARM_NS;
919

  
920
    itv.it_interval.tv_sec = 0;
921
    itv.it_interval.tv_usec = 0; /* 0 for one-shot timer */
922
    itv.it_value.tv_sec =  nearest_delta_ns / 1000000000;
923
    itv.it_value.tv_usec = (nearest_delta_ns % 1000000000) / 1000;
924
    err = setitimer(ITIMER_REAL, &itv, NULL);
925
    if (err) {
926
        perror("setitimer");
927
        fprintf(stderr, "Internal timer error: aborting\n");
928
        exit(1);
929
    }
914 930
}
915 931

  
916 932
static void unix_stop_timer(struct qemu_alarm_timer *t)

Also available in: Unified diff