aboutsummaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
authorkfraser@localhost.localdomain <kfraser@localhost.localdomain>2007-09-11 17:00:25 +0100
committerkfraser@localhost.localdomain <kfraser@localhost.localdomain>2007-09-11 17:00:25 +0100
commit4b7f2195f323bf9d9808f7482a493555e45e57b7 (patch)
treed317034d44075776b77de12d7f88f2c9efadf3cb /tools
parent07c60e81f0f93c4bb9d6bba41a6bfc8d7e646a81 (diff)
downloadxen-4b7f2195f323bf9d9808f7482a493555e45e57b7.tar.gz
xen-4b7f2195f323bf9d9808f7482a493555e45e57b7.tar.bz2
xen-4b7f2195f323bf9d9808f7482a493555e45e57b7.zip
qemu: Backport qemu vnc/event-loop fix from upstream.
Signed-off-by: Keir Fraser <keir@xensource.com>
Diffstat (limited to 'tools')
-rw-r--r--tools/ioemu/vl.c28
1 files changed, 22 insertions, 6 deletions
diff --git a/tools/ioemu/vl.c b/tools/ioemu/vl.c
index 350a1e2e20..6c300fa3d3 100644
--- a/tools/ioemu/vl.c
+++ b/tools/ioemu/vl.c
@@ -4312,6 +4312,7 @@ typedef struct IOHandlerRecord {
IOCanRWHandler *fd_read_poll;
IOHandler *fd_read;
IOHandler *fd_write;
+ int deleted;
void *opaque;
/* temporary data */
struct pollfd *ufd;
@@ -4337,8 +4338,7 @@ int qemu_set_fd_handler2(int fd,
if (ioh == NULL)
break;
if (ioh->fd == fd) {
- *pioh = ioh->next;
- qemu_free(ioh);
+ ioh->deleted = 1;
break;
}
pioh = &ioh->next;
@@ -4359,6 +4359,7 @@ int qemu_set_fd_handler2(int fd,
ioh->fd_read = fd_read;
ioh->fd_write = fd_write;
ioh->opaque = opaque;
+ ioh->deleted = 0;
}
return 0;
}
@@ -6105,7 +6106,7 @@ void qemu_system_powerdown_request(void)
void main_loop_wait(int timeout)
{
- IOHandlerRecord *ioh, *ioh_next;
+ IOHandlerRecord *ioh;
fd_set rfds, wfds, xfds;
int ret, nfds;
struct timeval tv;
@@ -6140,6 +6141,8 @@ void main_loop_wait(int timeout)
FD_ZERO(&wfds);
FD_ZERO(&xfds);
for(ioh = first_io_handler; ioh != NULL; ioh = ioh->next) {
+ if (ioh->deleted)
+ continue;
if (ioh->fd_read &&
(!ioh->fd_read_poll ||
ioh->fd_read_poll(ioh->opaque) != 0)) {
@@ -6167,9 +6170,11 @@ void main_loop_wait(int timeout)
#endif
ret = select(nfds + 1, &rfds, &wfds, &xfds, &tv);
if (ret > 0) {
- /* XXX: better handling of removal */
- for(ioh = first_io_handler; ioh != NULL; ioh = ioh_next) {
- ioh_next = ioh->next;
+ IOHandlerRecord **pioh;
+
+ for(ioh = first_io_handler; ioh != NULL; ioh = ioh->next) {
+ if (ioh->deleted)
+ continue;
if (ioh->fd_read && FD_ISSET(ioh->fd, &rfds)) {
ioh->fd_read(ioh->opaque);
}
@@ -6177,6 +6182,17 @@ void main_loop_wait(int timeout)
ioh->fd_write(ioh->opaque);
}
}
+
+ /* remove deleted IO handlers */
+ pioh = &first_io_handler;
+ while (*pioh) {
+ ioh = *pioh;
+ if (ioh->deleted) {
+ *pioh = ioh->next;
+ qemu_free(ioh);
+ } else
+ pioh = &ioh->next;
+ }
}
#if defined(CONFIG_SLIRP)
if (slirp_inited) {