main_loop_wait: block indefinitely
- remove qemu_calculate_timeout; - explicitly size timeout to uint32_t; - introduce slirp_update_timeout; - pass NULL as timeout argument to select in case timeout is the maximum value; Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com> Acked-by: Paul Brook <paul@codesourcery.com> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
This commit is contained in:
		
							parent
							
								
									4ffd16fc29
								
							
						
					
					
						commit
						7c7db75576
					
				
							
								
								
									
										2
									
								
								async.c
								
								
								
								
							
							
						
						
									
										2
									
								
								async.c
								
								
								
								
							| 
						 | 
					@ -120,7 +120,7 @@ void qemu_bh_delete(QEMUBH *bh)
 | 
				
			||||||
    bh->deleted = 1;
 | 
					    bh->deleted = 1;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void qemu_bh_update_timeout(int *timeout)
 | 
					void qemu_bh_update_timeout(uint32_t *timeout)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    QEMUBH *bh;
 | 
					    QEMUBH *bh;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										23
									
								
								main-loop.c
								
								
								
								
							
							
						
						
									
										23
									
								
								main-loop.c
								
								
								
								
							| 
						 | 
					@ -226,7 +226,7 @@ static int max_priority;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef _WIN32
 | 
					#ifndef _WIN32
 | 
				
			||||||
static void glib_select_fill(int *max_fd, fd_set *rfds, fd_set *wfds,
 | 
					static void glib_select_fill(int *max_fd, fd_set *rfds, fd_set *wfds,
 | 
				
			||||||
                             fd_set *xfds, int *cur_timeout)
 | 
					                             fd_set *xfds, uint32_t *cur_timeout)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    GMainContext *context = g_main_context_default();
 | 
					    GMainContext *context = g_main_context_default();
 | 
				
			||||||
    int i;
 | 
					    int i;
 | 
				
			||||||
| 
						 | 
					@ -288,20 +288,24 @@ static void glib_select_poll(fd_set *rfds, fd_set *wfds, fd_set *xfds,
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int os_host_main_loop_wait(int timeout)
 | 
					static int os_host_main_loop_wait(uint32_t timeout)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    struct timeval tv;
 | 
					    struct timeval tv, *tvarg = NULL;
 | 
				
			||||||
    int ret;
 | 
					    int ret;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    glib_select_fill(&nfds, &rfds, &wfds, &xfds, &timeout);
 | 
					    glib_select_fill(&nfds, &rfds, &wfds, &xfds, &timeout);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (timeout < UINT32_MAX) {
 | 
				
			||||||
 | 
					        tvarg = &tv;
 | 
				
			||||||
 | 
					        tv.tv_sec = timeout / 1000;
 | 
				
			||||||
 | 
					        tv.tv_usec = (timeout % 1000) * 1000;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (timeout > 0) {
 | 
					    if (timeout > 0) {
 | 
				
			||||||
        qemu_mutex_unlock_iothread();
 | 
					        qemu_mutex_unlock_iothread();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    tv.tv_sec = timeout / 1000;
 | 
					    ret = select(nfds + 1, &rfds, &wfds, &xfds, tvarg);
 | 
				
			||||||
    tv.tv_usec = (timeout % 1000) * 1000;
 | 
					 | 
				
			||||||
    ret = select(nfds + 1, &rfds, &wfds, &xfds, &tv);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (timeout > 0) {
 | 
					    if (timeout > 0) {
 | 
				
			||||||
        qemu_mutex_lock_iothread();
 | 
					        qemu_mutex_lock_iothread();
 | 
				
			||||||
| 
						 | 
					@ -400,7 +404,7 @@ void qemu_fd_register(int fd)
 | 
				
			||||||
                   FD_CONNECT | FD_WRITE | FD_OOB);
 | 
					                   FD_CONNECT | FD_WRITE | FD_OOB);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int os_host_main_loop_wait(int timeout)
 | 
					static int os_host_main_loop_wait(uint32_t timeout)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    GMainContext *context = g_main_context_default();
 | 
					    GMainContext *context = g_main_context_default();
 | 
				
			||||||
    int ret, i;
 | 
					    int ret, i;
 | 
				
			||||||
| 
						 | 
					@ -463,12 +467,12 @@ static int os_host_main_loop_wait(int timeout)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int main_loop_wait(int nonblocking)
 | 
					int main_loop_wait(int nonblocking)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    int ret, timeout;
 | 
					    int ret;
 | 
				
			||||||
 | 
					    uint32_t timeout = UINT32_MAX;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (nonblocking) {
 | 
					    if (nonblocking) {
 | 
				
			||||||
        timeout = 0;
 | 
					        timeout = 0;
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
        timeout = qemu_calculate_timeout();
 | 
					 | 
				
			||||||
        qemu_bh_update_timeout(&timeout);
 | 
					        qemu_bh_update_timeout(&timeout);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -480,6 +484,7 @@ int main_loop_wait(int nonblocking)
 | 
				
			||||||
    FD_ZERO(&xfds);
 | 
					    FD_ZERO(&xfds);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef CONFIG_SLIRP
 | 
					#ifdef CONFIG_SLIRP
 | 
				
			||||||
 | 
					    slirp_update_timeout(&timeout);
 | 
				
			||||||
    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);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -365,6 +365,6 @@ void qemu_iohandler_poll(fd_set *readfds, fd_set *writefds, fd_set *xfds, int rc
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void qemu_bh_schedule_idle(QEMUBH *bh);
 | 
					void qemu_bh_schedule_idle(QEMUBH *bh);
 | 
				
			||||||
int qemu_bh_poll(void);
 | 
					int qemu_bh_poll(void);
 | 
				
			||||||
void qemu_bh_update_timeout(int *timeout);
 | 
					void qemu_bh_update_timeout(uint32_t *timeout);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -821,8 +821,3 @@ fail:
 | 
				
			||||||
    return err;
 | 
					    return err;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int qemu_calculate_timeout(void)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    return 1000;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -63,7 +63,6 @@ void qemu_run_timers(QEMUClock *clock);
 | 
				
			||||||
void qemu_run_all_timers(void);
 | 
					void qemu_run_all_timers(void);
 | 
				
			||||||
int qemu_alarm_pending(void);
 | 
					int qemu_alarm_pending(void);
 | 
				
			||||||
void configure_alarms(char const *opt);
 | 
					void configure_alarms(char const *opt);
 | 
				
			||||||
int qemu_calculate_timeout(void);
 | 
					 | 
				
			||||||
void init_clocks(void);
 | 
					void init_clocks(void);
 | 
				
			||||||
int init_timer_alarm(void);
 | 
					int init_timer_alarm(void);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -90,6 +90,10 @@ int qemu_init_main_loop(void)
 | 
				
			||||||
    return main_loop_init();
 | 
					    return main_loop_init();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void slirp_update_timeout(uint32_t *timeout)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void slirp_select_fill(int *pnfds, fd_set *readfds,
 | 
					void slirp_select_fill(int *pnfds, fd_set *readfds,
 | 
				
			||||||
                       fd_set *writefds, fd_set *xfds)
 | 
					                       fd_set *writefds, fd_set *xfds)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -15,6 +15,7 @@ Slirp *slirp_init(int restricted, struct in_addr vnetwork,
 | 
				
			||||||
                  struct in_addr vnameserver, void *opaque);
 | 
					                  struct in_addr vnameserver, void *opaque);
 | 
				
			||||||
void slirp_cleanup(Slirp *slirp);
 | 
					void slirp_cleanup(Slirp *slirp);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void slirp_update_timeout(uint32_t *timeout);
 | 
				
			||||||
void slirp_select_fill(int *pnfds,
 | 
					void slirp_select_fill(int *pnfds,
 | 
				
			||||||
                       fd_set *readfds, fd_set *writefds, fd_set *xfds);
 | 
					                       fd_set *readfds, fd_set *writefds, fd_set *xfds);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -258,6 +258,13 @@ void slirp_cleanup(Slirp *slirp)
 | 
				
			||||||
#define CONN_CANFRCV(so) (((so)->so_state & (SS_FCANTRCVMORE|SS_ISFCONNECTED)) == SS_ISFCONNECTED)
 | 
					#define CONN_CANFRCV(so) (((so)->so_state & (SS_FCANTRCVMORE|SS_ISFCONNECTED)) == SS_ISFCONNECTED)
 | 
				
			||||||
#define UPD_NFDS(x) if (nfds < (x)) nfds = (x)
 | 
					#define UPD_NFDS(x) if (nfds < (x)) nfds = (x)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void slirp_update_timeout(uint32_t *timeout)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    if (!QTAILQ_EMPTY(&slirp_instances)) {
 | 
				
			||||||
 | 
					        *timeout = MIN(1000, *timeout);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void slirp_select_fill(int *pnfds,
 | 
					void slirp_select_fill(int *pnfds,
 | 
				
			||||||
                       fd_set *readfds, fd_set *writefds, fd_set *xfds)
 | 
					                       fd_set *readfds, fd_set *writefds, fd_set *xfds)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue