 71973b0461
			
		
	
	
		71973b0461
		
	
	
	
	
		
			
			Outside the safety of the global mutex we need to poll on file descriptors. I found epoll(2) is a convenient way to do that, although other options could replace this module in the future (such as an AioContext-based loop or glib's GMainLoop). One important feature of this small event loop implementation is that the loop can be terminated in a thread-safe way. This allows QEMU to stop the data plane thread cleanly. Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
		
			
				
	
	
		
			41 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			41 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  * Event loop with file descriptor polling
 | |
|  *
 | |
|  * Copyright 2012 IBM, Corp.
 | |
|  * Copyright 2012 Red Hat, Inc. and/or its affiliates
 | |
|  *
 | |
|  * Authors:
 | |
|  *   Stefan Hajnoczi <stefanha@redhat.com>
 | |
|  *
 | |
|  * This work is licensed under the terms of the GNU GPL, version 2 or later.
 | |
|  * See the COPYING file in the top-level directory.
 | |
|  *
 | |
|  */
 | |
| 
 | |
| #ifndef EVENT_POLL_H
 | |
| #define EVENT_POLL_H
 | |
| 
 | |
| #include "qemu/event_notifier.h"
 | |
| 
 | |
| typedef struct EventHandler EventHandler;
 | |
| typedef void EventCallback(EventHandler *handler);
 | |
| struct EventHandler {
 | |
|     EventNotifier *notifier;        /* eventfd */
 | |
|     EventCallback *callback;        /* callback function */
 | |
| };
 | |
| 
 | |
| typedef struct {
 | |
|     int epoll_fd;                   /* epoll(2) file descriptor */
 | |
|     EventNotifier stop_notifier;    /* stop poll notifier */
 | |
|     EventHandler stop_handler;      /* stop poll handler */
 | |
| } EventPoll;
 | |
| 
 | |
| void event_poll_add(EventPoll *poll, EventHandler *handler,
 | |
|                     EventNotifier *notifier, EventCallback *callback);
 | |
| void event_poll_init(EventPoll *poll);
 | |
| void event_poll_cleanup(EventPoll *poll);
 | |
| void event_poll(EventPoll *poll);
 | |
| void event_poll_notify(EventPoll *poll);
 | |
| 
 | |
| #endif /* EVENT_POLL_H */
 |