From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from [140.186.70.92] (port=45505 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1OHHN6-0003N8-3j for qemu-devel@nongnu.org; Wed, 26 May 2010 10:14:13 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.69) (envelope-from ) id 1OHHJ3-00048M-QZ for qemu-devel@nongnu.org; Wed, 26 May 2010 10:10:07 -0400 Received: from mail-wy0-f173.google.com ([74.125.82.173]:38260) by eggs.gnu.org with esmtp (Exim 4.69) (envelope-from ) id 1OHHJ3-00046k-L3 for qemu-devel@nongnu.org; Wed, 26 May 2010 10:10:01 -0400 Received: by mail-wy0-f173.google.com with SMTP id 28so1007524wyf.4 for ; Wed, 26 May 2010 07:10:01 -0700 (PDT) Sender: Paolo Bonzini From: Paolo Bonzini Date: Wed, 26 May 2010 16:09:37 +0200 Message-Id: <1274882978-9875-8-git-send-email-pbonzini@redhat.com> In-Reply-To: <1274882978-9875-1-git-send-email-pbonzini@redhat.com> References: <1274882978-9875-1-git-send-email-pbonzini@redhat.com> Subject: [Qemu-devel] [PATCH 7/8] add Win32 implementation of event notifiers List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Signed-off-by: Paolo Bonzini --- Compile-tested only. iothread is broken anyway on Win32 due to missing implementation of qemu-threads. event_notifier.c | 33 +++++++++++++++++++++++++++++++++ event_notifier.h | 8 ++++++++ 2 files changed, 41 insertions(+), 0 deletions(-) diff --git a/event_notifier.c b/event_notifier.c index a33f3c5..0705dc5 100644 --- a/event_notifier.c +++ b/event_notifier.c @@ -11,11 +11,13 @@ */ #include "qemu-common.h" +#include "sysemu.h" #include "event_notifier.h" #include "qemu-char.h" int event_notifier_init(EventNotifier *e, int active) { +#ifndef _WIN32 int fds[2]; int err; if (qemu_eventfd (fds) < 0) @@ -39,27 +41,50 @@ fail: close(fds[0]); close(fds[1]); return err; +#else + e->event = CreateEvent(NULL, FALSE, FALSE, NULL); + assert(e->event); + return 0; +#endif } void event_notifier_cleanup(EventNotifier *e) { +#ifndef _WIN32 close(e->rfd); close(e->wfd); +#else + CloseHandle(e->event); +#endif } int event_notifier_get_fd(EventNotifier *e) { +#ifndef _WIN32 return e->wfd; +#else + abort(); +#endif } int event_notifier_set_handler(EventNotifier *e, EventNotifierHandler *handler) { +#ifndef _WIN32 return qemu_set_fd_handler(e->rfd, (IOHandler *)handler, NULL, e); +#else + if (handler) { + return qemu_add_wait_object(e->event, (IOHandler *)handler, e); + } else { + qemu_del_wait_object(e->event, (IOHandler *)handler, e); + return 0; + } +#endif } int event_notifier_set(EventNotifier *e) { +#ifndef _WIN32 static const uint64_t value = 1; ssize_t ret; @@ -72,10 +97,15 @@ int event_notifier_set(EventNotifier *e) return -1; } return 0; +#else + SetEvent(e->event); + return 0; +#endif } int event_notifier_test_and_clear(EventNotifier *e) { +#ifndef _WIN32 int value; ssize_t len; char buffer[512]; @@ -88,4 +118,7 @@ int event_notifier_test_and_clear(EventNotifier *e) } while ((len == -1 && errno == EINTR) || len == sizeof(buffer)); return value; +#else + return WaitForSingleObject(e->event, 0) == WAIT_OBJECT_0; +#endif } diff --git a/event_notifier.h b/event_notifier.h index ff9d6f2..f3c272a 100644 --- a/event_notifier.h +++ b/event_notifier.h @@ -3,9 +3,17 @@ #include "qemu-common.h" +#ifdef _WIN32 +#include +#endif + struct EventNotifier { +#ifdef _WIN32 + HANDLE event; +#else int rfd; int wfd; +#endif }; typedef void EventNotifierHandler(EventNotifier *); -- 1.6.6.1