提交 56f3a5d0 编写于 作者: A aliguori

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
上级 80d3580b
...@@ -58,6 +58,7 @@ int qemu_savevm_state_complete(QEMUFile *f); ...@@ -58,6 +58,7 @@ int qemu_savevm_state_complete(QEMUFile *f);
int qemu_savevm_state(QEMUFile *f); int qemu_savevm_state(QEMUFile *f);
int qemu_loadvm_state(QEMUFile *f); int qemu_loadvm_state(QEMUFile *f);
#ifdef _WIN32
/* Polling handling */ /* Polling handling */
/* return TRUE if no sleep should be done afterwards */ /* return TRUE if no sleep should be done afterwards */
...@@ -66,7 +67,6 @@ typedef int PollingFunc(void *opaque); ...@@ -66,7 +67,6 @@ typedef int PollingFunc(void *opaque);
int qemu_add_polling_cb(PollingFunc *func, void *opaque); int qemu_add_polling_cb(PollingFunc *func, void *opaque);
void qemu_del_polling_cb(PollingFunc *func, void *opaque); void qemu_del_polling_cb(PollingFunc *func, void *opaque);
#ifdef _WIN32
/* Wait objects handling */ /* Wait objects handling */
typedef void WaitObjectFunc(void *opaque); typedef void WaitObjectFunc(void *opaque);
......
...@@ -6140,6 +6140,7 @@ int qemu_set_fd_handler(int fd, ...@@ -6140,6 +6140,7 @@ int qemu_set_fd_handler(int fd,
return qemu_set_fd_handler2(fd, NULL, fd_read, fd_write, opaque); return qemu_set_fd_handler2(fd, NULL, fd_read, fd_write, opaque);
} }
#ifdef _WIN32
/***********************************************************/ /***********************************************************/
/* Polling handling */ /* Polling handling */
...@@ -6177,7 +6178,6 @@ void qemu_del_polling_cb(PollingFunc *func, void *opaque) ...@@ -6177,7 +6178,6 @@ void qemu_del_polling_cb(PollingFunc *func, void *opaque)
} }
} }
#ifdef _WIN32
/***********************************************************/ /***********************************************************/
/* Wait objects support */ /* Wait objects support */
typedef struct WaitObjects { typedef struct WaitObjects {
...@@ -7688,6 +7688,26 @@ void qemu_bh_delete(QEMUBH *bh) ...@@ -7688,6 +7688,26 @@ void qemu_bh_delete(QEMUBH *bh)
bh->deleted = 1; bh->deleted = 1;
} }
static void qemu_bh_update_timeout(int *timeout)
{
QEMUBH *bh;
for (bh = first_bh; bh; bh = bh->next) {
if (!bh->deleted && bh->scheduled) {
if (bh->idle) {
/* idle bottom halves will be polled at least
* every 10ms */
*timeout = MIN(10, *timeout);
} else {
/* non-idle bottom halves will be executed
* immediately */
*timeout = 0;
break;
}
}
}
}
/***********************************************************/ /***********************************************************/
/* machine registration */ /* machine registration */
...@@ -7890,15 +7910,10 @@ void qemu_system_powerdown_request(void) ...@@ -7890,15 +7910,10 @@ void qemu_system_powerdown_request(void)
cpu_interrupt(cpu_single_env, CPU_INTERRUPT_EXIT); cpu_interrupt(cpu_single_env, CPU_INTERRUPT_EXIT);
} }
void main_loop_wait(int timeout)
{
IOHandlerRecord *ioh;
fd_set rfds, wfds, xfds;
int ret, nfds;
#ifdef _WIN32 #ifdef _WIN32
int ret2, i; void host_main_loop_wait(int *timeout)
#endif {
struct timeval tv; int ret, ret2, i;
PollingEntry *pe; PollingEntry *pe;
...@@ -7907,12 +7922,11 @@ void main_loop_wait(int timeout) ...@@ -7907,12 +7922,11 @@ void main_loop_wait(int timeout)
for(pe = first_polling_entry; pe != NULL; pe = pe->next) { for(pe = first_polling_entry; pe != NULL; pe = pe->next) {
ret |= pe->func(pe->opaque); ret |= pe->func(pe->opaque);
} }
#ifdef _WIN32
if (ret == 0) { if (ret == 0) {
int err; int err;
WaitObjects *w = &wait_objects; WaitObjects *w = &wait_objects;
ret = WaitForMultipleObjects(w->num, w->events, FALSE, timeout); ret = WaitForMultipleObjects(w->num, w->events, FALSE, *timeout);
if (WAIT_OBJECT_0 + 0 <= ret && ret <= WAIT_OBJECT_0 + w->num - 1) { if (WAIT_OBJECT_0 + 0 <= ret && ret <= WAIT_OBJECT_0 + w->num - 1) {
if (w->func[ret - WAIT_OBJECT_0]) if (w->func[ret - WAIT_OBJECT_0])
w->func[ret - WAIT_OBJECT_0](w->opaque[ret - WAIT_OBJECT_0]); w->func[ret - WAIT_OBJECT_0](w->opaque[ret - WAIT_OBJECT_0]);
...@@ -7937,7 +7951,26 @@ void main_loop_wait(int timeout) ...@@ -7937,7 +7951,26 @@ void main_loop_wait(int timeout)
fprintf(stderr, "WaitForMultipleObjects error %d %d\n", ret, err); fprintf(stderr, "WaitForMultipleObjects error %d %d\n", ret, err);
} }
} }
*timeout = 0;
}
#else
void host_main_loop_wait(int *timeout)
{
}
#endif #endif
void main_loop_wait(int timeout)
{
IOHandlerRecord *ioh;
fd_set rfds, wfds, xfds;
int ret, nfds;
struct timeval tv;
qemu_bh_update_timeout(&timeout);
host_main_loop_wait(&timeout);
/* poll any events */ /* poll any events */
/* XXX: separate device handlers from system ones */ /* XXX: separate device handlers from system ones */
nfds = -1; nfds = -1;
...@@ -7961,12 +7994,9 @@ void main_loop_wait(int timeout) ...@@ -7961,12 +7994,9 @@ void main_loop_wait(int timeout)
} }
} }
tv.tv_sec = 0; tv.tv_sec = timeout / 1000;
#ifdef _WIN32 tv.tv_usec = (timeout % 1000) * 1000;
tv.tv_usec = 0;
#else
tv.tv_usec = timeout * 1000;
#endif
#if defined(CONFIG_SLIRP) #if defined(CONFIG_SLIRP)
if (slirp_inited) { if (slirp_inited) {
slirp_select_fill(&nfds, &rfds, &wfds, &xfds); slirp_select_fill(&nfds, &rfds, &wfds, &xfds);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册