mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-05 00:33:55 -06:00
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>
This commit is contained in:
parent
88807f89d9
commit
71973b0461
3 changed files with 141 additions and 1 deletions
40
hw/dataplane/event-poll.h
Normal file
40
hw/dataplane/event-poll.h
Normal file
|
@ -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 */
|
Loading…
Add table
Add a link
Reference in a new issue