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