main-loop: use GSource to poll AIO file descriptors
This lets us remove the hooks for the main loop in async.c. Reviewed-by: Anthony Liguori <aliguori@us.ibm.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
		
							parent
							
								
									7ed2b24ce1
								
							
						
					
					
						commit
						82cbbdc6a0
					
				
							
								
								
									
										23
									
								
								main-loop.c
									
									
									
									
									
								
							
							
						
						
									
										23
									
								
								main-loop.c
									
									
									
									
									
								
							@ -205,6 +205,7 @@ static AioContext *qemu_aio_context;
 | 
				
			|||||||
int qemu_init_main_loop(void)
 | 
					int qemu_init_main_loop(void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    int ret;
 | 
					    int ret;
 | 
				
			||||||
 | 
					    GSource *src;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    init_clocks();
 | 
					    init_clocks();
 | 
				
			||||||
    init_timer_alarm();
 | 
					    init_timer_alarm();
 | 
				
			||||||
@ -222,6 +223,9 @@ int qemu_init_main_loop(void)
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    qemu_aio_context = aio_context_new();
 | 
					    qemu_aio_context = aio_context_new();
 | 
				
			||||||
 | 
					    src = aio_get_g_source(qemu_aio_context);
 | 
				
			||||||
 | 
					    g_source_attach(src, NULL);
 | 
				
			||||||
 | 
					    g_source_unref(src);
 | 
				
			||||||
    return 0;
 | 
					    return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -484,8 +488,6 @@ int main_loop_wait(int nonblocking)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    if (nonblocking) {
 | 
					    if (nonblocking) {
 | 
				
			||||||
        timeout = 0;
 | 
					        timeout = 0;
 | 
				
			||||||
    } else {
 | 
					 | 
				
			||||||
        aio_bh_update_timeout(qemu_aio_context, &timeout);
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* poll any events */
 | 
					    /* poll any events */
 | 
				
			||||||
@ -508,10 +510,6 @@ int main_loop_wait(int nonblocking)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    qemu_run_all_timers();
 | 
					    qemu_run_all_timers();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* Check bottom-halves last in case any of the earlier events triggered
 | 
					 | 
				
			||||||
       them.  */
 | 
					 | 
				
			||||||
    qemu_bh_poll();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    return ret;
 | 
					    return ret;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -522,11 +520,6 @@ QEMUBH *qemu_bh_new(QEMUBHFunc *cb, void *opaque)
 | 
				
			|||||||
    return aio_bh_new(qemu_aio_context, cb, opaque);
 | 
					    return aio_bh_new(qemu_aio_context, cb, opaque);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int qemu_bh_poll(void)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    return aio_bh_poll(qemu_aio_context);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void qemu_aio_flush(void)
 | 
					void qemu_aio_flush(void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    aio_flush(qemu_aio_context);
 | 
					    aio_flush(qemu_aio_context);
 | 
				
			||||||
@ -546,16 +539,12 @@ void qemu_aio_set_fd_handler(int fd,
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
    aio_set_fd_handler(qemu_aio_context, fd, io_read, io_write, io_flush,
 | 
					    aio_set_fd_handler(qemu_aio_context, fd, io_read, io_write, io_flush,
 | 
				
			||||||
                       opaque);
 | 
					                       opaque);
 | 
				
			||||||
 | 
					 | 
				
			||||||
    qemu_set_fd_handler2(fd, NULL, io_read, io_write, opaque);
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void qemu_aio_set_event_notifier(EventNotifier *notifier,
 | 
					void qemu_aio_set_event_notifier(EventNotifier *notifier,
 | 
				
			||||||
                                 EventNotifierHandler *io_read,
 | 
					                                 EventNotifierHandler *io_read,
 | 
				
			||||||
                                 AioFlushEventNotifierHandler *io_flush)
 | 
					                                 AioFlushEventNotifierHandler *io_flush)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    qemu_aio_set_fd_handler(event_notifier_get_fd(notifier),
 | 
					    aio_set_event_notifier(qemu_aio_context, notifier, io_read, io_flush);
 | 
				
			||||||
                            (IOHandler *)io_read, NULL,
 | 
					 | 
				
			||||||
                            (AioFlushHandler *)io_flush, notifier);
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
				
			|||||||
@ -302,6 +302,5 @@ void qemu_iohandler_poll(fd_set *readfds, fd_set *writefds, fd_set *xfds, int rc
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
QEMUBH *qemu_bh_new(QEMUBHFunc *cb, void *opaque);
 | 
					QEMUBH *qemu_bh_new(QEMUBHFunc *cb, void *opaque);
 | 
				
			||||||
void qemu_bh_schedule_idle(QEMUBH *bh);
 | 
					void qemu_bh_schedule_idle(QEMUBH *bh);
 | 
				
			||||||
int qemu_bh_poll(void);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user