SOURCES (AC-branch): qemu-0.9.0-remove-iohandlers.patch (NEW) - ad...
heretyk
heretyk at pld-linux.org
Wed Apr 18 23:50:20 CEST 2007
Author: heretyk Date: Wed Apr 18 21:50:20 2007 GMT
Module: SOURCES Tag: AC-branch
---- Log message:
- added patch to fix crash when using qemu with NICs connected via socket
- release 4
---- Files affected:
SOURCES:
qemu-0.9.0-remove-iohandlers.patch (NONE -> 1.1.2.1) (NEW)
---- Diffs:
================================================================
Index: SOURCES/qemu-0.9.0-remove-iohandlers.patch
diff -u /dev/null SOURCES/qemu-0.9.0-remove-iohandlers.patch:1.1.2.1
--- /dev/null Wed Apr 18 23:50:20 2007
+++ SOURCES/qemu-0.9.0-remove-iohandlers.patch Wed Apr 18 23:50:15 2007
@@ -0,0 +1,80 @@
+diff -Naur qemu-0.9.0.orig/vl.c qemu-0.9.0/vl.c
+--- qemu-0.9.0.orig/vl.c 2007-04-18 19:31:13.000000000 +0200
++++ qemu-0.9.0/vl.c 2007-04-18 19:32:03.000000000 +0200
+@@ -4140,6 +4140,7 @@
+ IOCanRWHandler *fd_read_poll;
+ IOHandler *fd_read;
+ IOHandler *fd_write;
++ int deleted;
+ void *opaque;
+ /* temporary data */
+ struct pollfd *ufd;
+@@ -4165,8 +4166,7 @@
+ if (ioh == NULL)
+ break;
+ if (ioh->fd == fd) {
+- *pioh = ioh->next;
+- qemu_free(ioh);
++ ioh->deleted = 1;
+ break;
+ }
+ pioh = &ioh->next;
+@@ -4187,6 +4187,7 @@
+ ioh->fd_read = fd_read;
+ ioh->fd_write = fd_write;
+ ioh->opaque = opaque;
++ ioh->deleted = 0;
+ }
+ return 0;
+ }
+@@ -5835,7 +5836,7 @@
+
+ void main_loop_wait(int timeout)
+ {
+- IOHandlerRecord *ioh, *ioh_next;
++ IOHandlerRecord *ioh;
+ fd_set rfds, wfds, xfds;
+ int ret, nfds;
+ struct timeval tv;
+@@ -5870,6 +5871,8 @@
+ 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)) {
+@@ -5897,9 +5900,11 @@
+ #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 (FD_ISSET(ioh->fd, &rfds)) {
+ ioh->fd_read(ioh->opaque);
+ }
+@@ -5907,6 +5912,17 @@
+ 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) {
================================================================
More information about the pld-cvs-commit
mailing list