diff options
author | Stefan Hajnoczi <stefanha@redhat.com> | 2012-11-14 15:23:00 +0100 |
---|---|---|
committer | Stefan Hajnoczi <stefanha@redhat.com> | 2013-01-02 15:56:21 +0100 |
commit | 71973b046120a13df4eaa9143bed5ba8a67abc7f (patch) | |
tree | 228fdc6cad32ccf9d2bac3a5b5ae0d8a03eb6a30 /hw/dataplane/event-poll.h | |
parent | 88807f89d945acad54c8365ff7b6ef0f0d0ddd56 (diff) | |
download | qemu-71973b046120a13df4eaa9143bed5ba8a67abc7f.zip qemu-71973b046120a13df4eaa9143bed5ba8a67abc7f.tar.gz qemu-71973b046120a13df4eaa9143bed5ba8a67abc7f.tar.bz2 |
dataplane: add event loop
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>
Diffstat (limited to 'hw/dataplane/event-poll.h')
-rw-r--r-- | hw/dataplane/event-poll.h | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/hw/dataplane/event-poll.h b/hw/dataplane/event-poll.h new file mode 100644 index 0000000..3e8d3ec --- /dev/null +++ b/hw/dataplane/event-poll.h @@ -0,0 +1,40 @@ +/* + * 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 */ |