From: Liu Ping Fan <pingf...@linux.vnet.ibm.com> When event poll can work with normal fd, we can port them onto the event loop.
Signed-off-by: Liu Ping Fan <pingf...@linux.vnet.ibm.com> --- hw/dataplane/event-poll.c | 36 ++++++++++++++++++++++++++++++++++++ hw/dataplane/event-poll.h | 8 ++++++++ 2 files changed, 44 insertions(+), 0 deletions(-) diff --git a/hw/dataplane/event-poll.c b/hw/dataplane/event-poll.c index 2b55c6e..b7dea53 100644 --- a/hw/dataplane/event-poll.c +++ b/hw/dataplane/event-poll.c @@ -32,6 +32,42 @@ void event_poll_add(EventPoll *poll, EventHandler *handler, } } +void event_poll_add_fd(EventPoll *poll, int fd, uint32_t type, + EventHandler *handler) +{ + struct epoll_event event = { + .events = type, + .data.ptr = handler, + }; + + if (epoll_ctl(poll->epoll_fd, EPOLL_CTL_ADD, fd, &event) != 0) { + fprintf(stderr, "failed to add event fd handler to epoll: %m\n"); + exit(1); + } + +} +void event_poll_del_fd(EventPoll *poll, int fd) +{ + if (epoll_ctl(poll->epoll_fd, EPOLL_CTL_DEL, fd, NULL) != 0) { + fprintf(stderr, "failed to del event handler to epoll: %m\n"); + exit(1); + } +} + + +void event_poll_modify_fd(EventPoll *poll, int fd, uint32_t type, + EventHandler *handler) +{ + struct epoll_event event = { + .events = type, + .data.ptr = handler, + }; + if (epoll_ctl(poll->epoll_fd, EPOLL_CTL_MOD, fd, &event) != 0) { + fprintf(stderr, "failed to modify event handler to epoll: %m\n"); + exit(1); + } +} + /* Event callback for stopping event_poll() */ static void handle_stop(EventHandler *handler) { diff --git a/hw/dataplane/event-poll.h b/hw/dataplane/event-poll.h index 3e8d3ec..606138c 100644 --- a/hw/dataplane/event-poll.h +++ b/hw/dataplane/event-poll.h @@ -22,6 +22,8 @@ typedef void EventCallback(EventHandler *handler); struct EventHandler { EventNotifier *notifier; /* eventfd */ EventCallback *callback; /* callback function */ + void *opaque; + int fd; /* normal fd*/ }; typedef struct { @@ -32,6 +34,12 @@ typedef struct { void event_poll_add(EventPoll *poll, EventHandler *handler, EventNotifier *notifier, EventCallback *callback); +void event_poll_add_fd(EventPoll *poll, int fd, uint32_t type, + EventHandler *handler); +void event_poll_del_fd(EventPoll *poll, int fd); +void event_poll_modify_fd(EventPoll *poll, int fd, uint32_t type, + EventHandler *handler); + void event_poll_init(EventPoll *poll); void event_poll_cleanup(EventPoll *poll); void event_poll(EventPoll *poll); -- 1.7.4.4