main-loop: disable fd_set-based glib integration under w32
Using select with glib pollfds is wrong under w32. Restrict the code to the POSIX case. Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> Signed-off-by: Blue Swirl <blauwirbel@gmail.com>
This commit is contained in:
		
							parent
							
								
									4dae83aeac
								
							
						
					
					
						commit
						15455536df
					
				
							
								
								
									
										63
									
								
								main-loop.c
								
								
								
								
							
							
						
						
									
										63
									
								
								main-loop.c
								
								
								
								
							| 
						 | 
					@ -218,7 +218,10 @@ int main_loop_init(void)
 | 
				
			||||||
    return 0;
 | 
					    return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static fd_set rfds, wfds, xfds;
 | 
				
			||||||
 | 
					static int nfds;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef _WIN32
 | 
				
			||||||
static GPollFD poll_fds[1024 * 2]; /* this is probably overkill */
 | 
					static GPollFD poll_fds[1024 * 2]; /* this is probably overkill */
 | 
				
			||||||
static int n_poll_fds;
 | 
					static int n_poll_fds;
 | 
				
			||||||
static int max_priority;
 | 
					static int max_priority;
 | 
				
			||||||
| 
						 | 
					@ -286,7 +289,29 @@ static void glib_select_poll(fd_set *rfds, fd_set *wfds, fd_set *xfds,
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef _WIN32
 | 
					static int os_host_main_loop_wait(int timeout)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    struct timeval tv;
 | 
				
			||||||
 | 
					    int ret;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    glib_select_fill(&nfds, &rfds, &wfds, &xfds, &timeout);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (timeout > 0) {
 | 
				
			||||||
 | 
					        qemu_mutex_unlock_iothread();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    tv.tv_sec = timeout / 1000;
 | 
				
			||||||
 | 
					    tv.tv_usec = (timeout % 1000) * 1000;
 | 
				
			||||||
 | 
					    ret = select(nfds + 1, &rfds, &wfds, &xfds, &tv);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (timeout > 0) {
 | 
				
			||||||
 | 
					        qemu_mutex_lock_iothread();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    glib_select_poll(&rfds, &wfds, &xfds, (ret < 0));
 | 
				
			||||||
 | 
					    return ret;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
/***********************************************************/
 | 
					/***********************************************************/
 | 
				
			||||||
/* Polling handling */
 | 
					/* Polling handling */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -367,10 +392,11 @@ void qemu_del_wait_object(HANDLE handle, WaitObjectFunc *func, void *opaque)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void os_host_main_loop_wait(int *timeout)
 | 
					static int os_host_main_loop_wait(int timeout)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    int ret, ret2, i;
 | 
					    int ret, ret2, i;
 | 
				
			||||||
    PollingEntry *pe;
 | 
					    PollingEntry *pe;
 | 
				
			||||||
 | 
					    static struct timeval tv0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* XXX: need to suppress polling by better using win32 events */
 | 
					    /* XXX: need to suppress polling by better using win32 events */
 | 
				
			||||||
    ret = 0;
 | 
					    ret = 0;
 | 
				
			||||||
| 
						 | 
					@ -382,7 +408,7 @@ static void os_host_main_loop_wait(int *timeout)
 | 
				
			||||||
        WaitObjects *w = &wait_objects;
 | 
					        WaitObjects *w = &wait_objects;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        qemu_mutex_unlock_iothread();
 | 
					        qemu_mutex_unlock_iothread();
 | 
				
			||||||
        ret = WaitForMultipleObjects(w->num, w->events, FALSE, *timeout);
 | 
					        ret = WaitForMultipleObjects(w->num, w->events, FALSE, timeout);
 | 
				
			||||||
        qemu_mutex_lock_iothread();
 | 
					        qemu_mutex_lock_iothread();
 | 
				
			||||||
        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]) {
 | 
				
			||||||
| 
						 | 
					@ -408,20 +434,14 @@ static void os_host_main_loop_wait(int *timeout)
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    *timeout = 0;
 | 
					    ret = select(nfds + 1, &rfds, &wfds, &xfds, &tv0);
 | 
				
			||||||
}
 | 
					    return ret;
 | 
				
			||||||
#else
 | 
					 | 
				
			||||||
static inline void os_host_main_loop_wait(int *timeout)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int main_loop_wait(int nonblocking)
 | 
					int main_loop_wait(int nonblocking)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    fd_set rfds, wfds, xfds;
 | 
					    int ret, timeout;
 | 
				
			||||||
    int ret, nfds;
 | 
					 | 
				
			||||||
    struct timeval tv;
 | 
					 | 
				
			||||||
    int timeout;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (nonblocking) {
 | 
					    if (nonblocking) {
 | 
				
			||||||
        timeout = 0;
 | 
					        timeout = 0;
 | 
				
			||||||
| 
						 | 
					@ -441,24 +461,7 @@ int main_loop_wait(int nonblocking)
 | 
				
			||||||
    slirp_select_fill(&nfds, &rfds, &wfds, &xfds);
 | 
					    slirp_select_fill(&nfds, &rfds, &wfds, &xfds);
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
    qemu_iohandler_fill(&nfds, &rfds, &wfds, &xfds);
 | 
					    qemu_iohandler_fill(&nfds, &rfds, &wfds, &xfds);
 | 
				
			||||||
 | 
					    ret = os_host_main_loop_wait(timeout);
 | 
				
			||||||
    glib_select_fill(&nfds, &rfds, &wfds, &xfds, &timeout);
 | 
					 | 
				
			||||||
    os_host_main_loop_wait(&timeout);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    tv.tv_sec = timeout / 1000;
 | 
					 | 
				
			||||||
    tv.tv_usec = (timeout % 1000) * 1000;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (timeout > 0) {
 | 
					 | 
				
			||||||
        qemu_mutex_unlock_iothread();
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    ret = select(nfds + 1, &rfds, &wfds, &xfds, &tv);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (timeout > 0) {
 | 
					 | 
				
			||||||
        qemu_mutex_lock_iothread();
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    glib_select_poll(&rfds, &wfds, &xfds, (ret < 0));
 | 
					 | 
				
			||||||
    qemu_iohandler_poll(&rfds, &wfds, &xfds, ret);
 | 
					    qemu_iohandler_poll(&rfds, &wfds, &xfds, ret);
 | 
				
			||||||
#ifdef CONFIG_SLIRP
 | 
					#ifdef CONFIG_SLIRP
 | 
				
			||||||
    slirp_select_poll(&rfds, &wfds, &xfds, (ret < 0));
 | 
					    slirp_select_poll(&rfds, &wfds, &xfds, (ret < 0));
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue