]> git.proxmox.com Git - mirror_qemu.git/blobdiff - util/event_notifier-posix.c
Remove qemu-common.h include from most units
[mirror_qemu.git] / util / event_notifier-posix.c
index d4a0c63e1242d4653e8e3d95fd3c30ac9f54004e..8dc30c51414d915653bf073cd38ee44303c940b5 100644 (file)
  * See the COPYING file in the top-level directory.
  */
 
-#include "qemu-common.h"
+#include "qemu/osdep.h"
+#include "qemu/cutils.h"
 #include "qemu/event_notifier.h"
-#include "sysemu/char.h"
 #include "qemu/main-loop.h"
 
 #ifdef CONFIG_EVENTFD
 #include <sys/eventfd.h>
 #endif
 
+#ifdef CONFIG_EVENTFD
+/*
+ * Initialize @e with existing file descriptor @fd.
+ * @fd must be a genuine eventfd object, emulation with pipe won't do.
+ */
 void event_notifier_init_fd(EventNotifier *e, int fd)
 {
     e->rfd = fd;
     e->wfd = fd;
+    e->initialized = true;
 }
+#endif
 
 int event_notifier_init(EventNotifier *e, int active)
 {
@@ -58,6 +65,7 @@ int event_notifier_init(EventNotifier *e, int active)
         e->rfd = fds[0];
         e->wfd = fds[1];
     }
+    e->initialized = true;
     if (active) {
         event_notifier_set(e);
     }
@@ -71,10 +79,18 @@ fail:
 
 void event_notifier_cleanup(EventNotifier *e)
 {
+    if (!e->initialized) {
+        return;
+    }
+
     if (e->rfd != e->wfd) {
         close(e->rfd);
     }
+
+    e->rfd = -1;
     close(e->wfd);
+    e->wfd = -1;
+    e->initialized = false;
 }
 
 int event_notifier_get_fd(const EventNotifier *e)
@@ -82,11 +98,9 @@ int event_notifier_get_fd(const EventNotifier *e)
     return e->rfd;
 }
 
-int event_notifier_set_handler(EventNotifier *e,
-                               EventNotifierHandler *handler)
+int event_notifier_get_wfd(const EventNotifier *e)
 {
-    qemu_set_fd_handler(e->rfd, (IOHandler *)handler, NULL, e);
-    return 0;
+    return e->wfd;
 }
 
 int event_notifier_set(EventNotifier *e)
@@ -94,6 +108,10 @@ int event_notifier_set(EventNotifier *e)
     static const uint64_t value = 1;
     ssize_t ret;
 
+    if (!e->initialized) {
+        return -1;
+    }
+
     do {
         ret = write(e->wfd, &value, sizeof(value));
     } while (ret < 0 && errno == EINTR);
@@ -111,6 +129,10 @@ int event_notifier_test_and_clear(EventNotifier *e)
     ssize_t len;
     char buffer[512];
 
+    if (!e->initialized) {
+        return 0;
+    }
+
     /* Drain the notify pipe.  For eventfd, only 8 bytes will be read.  */
     value = 0;
     do {