@@ -25,6 +25,7 @@ void event_notifier_init_fd(EventNotifier *e, int fd)
int event_notifier_init(EventNotifier *e, int active)
{
+ assert(!event_notifier_valid(e));
#ifdef CONFIG_EVENTFD
int fd = eventfd(!!active, EFD_NONBLOCK | EFD_CLOEXEC);
if (fd < 0)
@@ -39,6 +40,12 @@ int event_notifier_init(EventNotifier *e, int active)
void event_notifier_cleanup(EventNotifier *e)
{
close(e->fd);
+ e->fd = -1;
+}
+
+bool event_notifier_valid(EventNotifier *e)
+{
+ return e->fd != -1;
}
int event_notifier_get_fd(EventNotifier *e)
@@ -65,3 +72,17 @@ int event_notifier_test_and_clear(EventNotifier *e)
int r = read(e->fd, &value, sizeof(value));
return r == sizeof(value);
}
+
+int event_notifier_notify(EventNotifier *e)
+{
+ uint64_t value = 1;
+ int r;
+
+ assert(event_notifier_valid(e));
+ r = write(e->fd, &value, sizeof(value));
+ if (r < 0) {
+ return -errno;
+ }
+ assert(r == sizeof(value));
+ return 0;
+}
@@ -15,6 +15,8 @@
#include "qemu-common.h"
+#define EVENT_NOTIFIER_INITIALIZER ((EventNotifier){ .fd = -1 })
+
struct EventNotifier {
int fd;
};
@@ -24,9 +26,11 @@ typedef void EventNotifierHandler(EventNotifier *);
void event_notifier_init_fd(EventNotifier *, int fd);
int event_notifier_init(EventNotifier *, int active);
void event_notifier_cleanup(EventNotifier *);
+bool event_notifier_valid(EventNotifier *e);
int event_notifier_get_fd(EventNotifier *);
int event_notifier_set(EventNotifier *);
int event_notifier_test_and_clear(EventNotifier *);
int event_notifier_set_handler(EventNotifier *, EventNotifierHandler *);
+int event_notifier_notify(EventNotifier *e);
#endif