Commit 56f3a5d01e435da0175e679d8a827d605a18e081
1 parent
80d3580b
Main loop fixes/cleanup
Tidy up win32 main loop bits, allow timeout >= 1s, and force timeout to 0 if there is a pending bottom half. git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@5577 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
2 changed files
with
48 additions
and
18 deletions
sysemu.h
... | ... | @@ -58,6 +58,7 @@ int qemu_savevm_state_complete(QEMUFile *f); |
58 | 58 | int qemu_savevm_state(QEMUFile *f); |
59 | 59 | int qemu_loadvm_state(QEMUFile *f); |
60 | 60 | |
61 | +#ifdef _WIN32 | |
61 | 62 | /* Polling handling */ |
62 | 63 | |
63 | 64 | /* return TRUE if no sleep should be done afterwards */ |
... | ... | @@ -66,7 +67,6 @@ typedef int PollingFunc(void *opaque); |
66 | 67 | int qemu_add_polling_cb(PollingFunc *func, void *opaque); |
67 | 68 | void qemu_del_polling_cb(PollingFunc *func, void *opaque); |
68 | 69 | |
69 | -#ifdef _WIN32 | |
70 | 70 | /* Wait objects handling */ |
71 | 71 | typedef void WaitObjectFunc(void *opaque); |
72 | 72 | ... | ... |
vl.c
... | ... | @@ -6140,6 +6140,7 @@ int qemu_set_fd_handler(int fd, |
6140 | 6140 | return qemu_set_fd_handler2(fd, NULL, fd_read, fd_write, opaque); |
6141 | 6141 | } |
6142 | 6142 | |
6143 | +#ifdef _WIN32 | |
6143 | 6144 | /***********************************************************/ |
6144 | 6145 | /* Polling handling */ |
6145 | 6146 | |
... | ... | @@ -6177,7 +6178,6 @@ void qemu_del_polling_cb(PollingFunc *func, void *opaque) |
6177 | 6178 | } |
6178 | 6179 | } |
6179 | 6180 | |
6180 | -#ifdef _WIN32 | |
6181 | 6181 | /***********************************************************/ |
6182 | 6182 | /* Wait objects support */ |
6183 | 6183 | typedef struct WaitObjects { |
... | ... | @@ -7688,6 +7688,26 @@ void qemu_bh_delete(QEMUBH *bh) |
7688 | 7688 | bh->deleted = 1; |
7689 | 7689 | } |
7690 | 7690 | |
7691 | +static void qemu_bh_update_timeout(int *timeout) | |
7692 | +{ | |
7693 | + QEMUBH *bh; | |
7694 | + | |
7695 | + for (bh = first_bh; bh; bh = bh->next) { | |
7696 | + if (!bh->deleted && bh->scheduled) { | |
7697 | + if (bh->idle) { | |
7698 | + /* idle bottom halves will be polled at least | |
7699 | + * every 10ms */ | |
7700 | + *timeout = MIN(10, *timeout); | |
7701 | + } else { | |
7702 | + /* non-idle bottom halves will be executed | |
7703 | + * immediately */ | |
7704 | + *timeout = 0; | |
7705 | + break; | |
7706 | + } | |
7707 | + } | |
7708 | + } | |
7709 | +} | |
7710 | + | |
7691 | 7711 | /***********************************************************/ |
7692 | 7712 | /* machine registration */ |
7693 | 7713 | |
... | ... | @@ -7890,15 +7910,10 @@ void qemu_system_powerdown_request(void) |
7890 | 7910 | cpu_interrupt(cpu_single_env, CPU_INTERRUPT_EXIT); |
7891 | 7911 | } |
7892 | 7912 | |
7893 | -void main_loop_wait(int timeout) | |
7894 | -{ | |
7895 | - IOHandlerRecord *ioh; | |
7896 | - fd_set rfds, wfds, xfds; | |
7897 | - int ret, nfds; | |
7898 | 7913 | #ifdef _WIN32 |
7899 | - int ret2, i; | |
7900 | -#endif | |
7901 | - struct timeval tv; | |
7914 | +void host_main_loop_wait(int *timeout) | |
7915 | +{ | |
7916 | + int ret, ret2, i; | |
7902 | 7917 | PollingEntry *pe; |
7903 | 7918 | |
7904 | 7919 | |
... | ... | @@ -7907,12 +7922,11 @@ void main_loop_wait(int timeout) |
7907 | 7922 | for(pe = first_polling_entry; pe != NULL; pe = pe->next) { |
7908 | 7923 | ret |= pe->func(pe->opaque); |
7909 | 7924 | } |
7910 | -#ifdef _WIN32 | |
7911 | 7925 | if (ret == 0) { |
7912 | 7926 | int err; |
7913 | 7927 | WaitObjects *w = &wait_objects; |
7914 | 7928 | |
7915 | - ret = WaitForMultipleObjects(w->num, w->events, FALSE, timeout); | |
7929 | + ret = WaitForMultipleObjects(w->num, w->events, FALSE, *timeout); | |
7916 | 7930 | if (WAIT_OBJECT_0 + 0 <= ret && ret <= WAIT_OBJECT_0 + w->num - 1) { |
7917 | 7931 | if (w->func[ret - WAIT_OBJECT_0]) |
7918 | 7932 | w->func[ret - WAIT_OBJECT_0](w->opaque[ret - WAIT_OBJECT_0]); |
... | ... | @@ -7937,7 +7951,26 @@ void main_loop_wait(int timeout) |
7937 | 7951 | fprintf(stderr, "WaitForMultipleObjects error %d %d\n", ret, err); |
7938 | 7952 | } |
7939 | 7953 | } |
7954 | + | |
7955 | + *timeout = 0; | |
7956 | +} | |
7957 | +#else | |
7958 | +void host_main_loop_wait(int *timeout) | |
7959 | +{ | |
7960 | +} | |
7940 | 7961 | #endif |
7962 | + | |
7963 | +void main_loop_wait(int timeout) | |
7964 | +{ | |
7965 | + IOHandlerRecord *ioh; | |
7966 | + fd_set rfds, wfds, xfds; | |
7967 | + int ret, nfds; | |
7968 | + struct timeval tv; | |
7969 | + | |
7970 | + qemu_bh_update_timeout(&timeout); | |
7971 | + | |
7972 | + host_main_loop_wait(&timeout); | |
7973 | + | |
7941 | 7974 | /* poll any events */ |
7942 | 7975 | /* XXX: separate device handlers from system ones */ |
7943 | 7976 | nfds = -1; |
... | ... | @@ -7961,12 +7994,9 @@ void main_loop_wait(int timeout) |
7961 | 7994 | } |
7962 | 7995 | } |
7963 | 7996 | |
7964 | - tv.tv_sec = 0; | |
7965 | -#ifdef _WIN32 | |
7966 | - tv.tv_usec = 0; | |
7967 | -#else | |
7968 | - tv.tv_usec = timeout * 1000; | |
7969 | -#endif | |
7997 | + tv.tv_sec = timeout / 1000; | |
7998 | + tv.tv_usec = (timeout % 1000) * 1000; | |
7999 | + | |
7970 | 8000 | #if defined(CONFIG_SLIRP) |
7971 | 8001 | if (slirp_inited) { |
7972 | 8002 | slirp_select_fill(&nfds, &rfds, &wfds, &xfds); | ... | ... |