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 */
 |