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