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