From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([208.118.235.92]:50609) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1USNvC-0000eG-KL for qemu-devel@nongnu.org; Wed, 17 Apr 2013 04:40:56 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1USNv9-0003OC-Lx for qemu-devel@nongnu.org; Wed, 17 Apr 2013 04:40:54 -0400 Received: from mail-pa0-f44.google.com ([209.85.220.44]:36069) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1USNv8-0003Nz-TZ for qemu-devel@nongnu.org; Wed, 17 Apr 2013 04:40:51 -0400 Received: by mail-pa0-f44.google.com with SMTP id bi5so822952pad.3 for ; Wed, 17 Apr 2013 01:40:50 -0700 (PDT) From: Liu Ping Fan Date: Wed, 17 Apr 2013 16:39:16 +0800 Message-Id: <1366187964-14265-8-git-send-email-qemulist@gmail.com> In-Reply-To: <1366187964-14265-1-git-send-email-qemulist@gmail.com> References: <1366187964-14265-1-git-send-email-qemulist@gmail.com> Subject: [Qemu-devel] [RFC PATCH v4 07/15] net: port tap-win32 onto GSource List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: mdroth , Paolo Bonzini , Stefan Hajnoczi , Anthony Liguori , Jan Kiszka From: Liu Ping Fan Signed-off-by: Liu Ping Fan --- net/tap-win32.c | 28 ++++++++++++++++++++++++++-- 1 files changed, 26 insertions(+), 2 deletions(-) diff --git a/net/tap-win32.c b/net/tap-win32.c index 91e9e84..e66edf1 100644 --- a/net/tap-win32.c +++ b/net/tap-win32.c @@ -635,13 +635,14 @@ static int tap_win32_open(tap_win32_overlapped_t **phandle, typedef struct TAPState { NetClientState nc; tap_win32_overlapped_t *handle; + EventGSource *nsrc; } TAPState; static void tap_cleanup(NetClientState *nc) { TAPState *s = DO_UPCAST(TAPState, nc, nc); - qemu_del_wait_object(s->handle->tap_semaphore, NULL, NULL); + event_source_release(s->nsrc); /* FIXME: need to kill thread and close file handle: tap_win32_close(s); @@ -669,19 +670,39 @@ static void tap_win32_send(void *opaque) } } +static void tap_bind_ctx(NetClientState *nc, GMainContext *ctx) +{ + TAPState *s = DO_UPCAST(TAPState, nc, nc); + + g_source_attach(&s->nsrc->source, ctx); +} + static NetClientInfo net_tap_win32_info = { .type = NET_CLIENT_OPTIONS_KIND_TAP, .size = sizeof(TAPState), .receive = tap_receive, .cleanup = tap_cleanup, + .bind_ctx = tap_bind_ctx, }; +static gboolean tap_win32_handler(gpointer data) +{ + EventGSource *nsrc = data; + TAPState *s = nsrc->opaque; + + if (nsrc->gfd.revents & G_IO_IN) { + tap_win32_send(s); + } + return true; +} + static int tap_win32_init(NetClientState *peer, const char *model, const char *name, const char *ifname) { NetClientState *nc; TAPState *s; tap_win32_overlapped_t *handle; + EventGSource *nsrc; if (tap_win32_open(&handle, ifname) < 0) { printf("tap: Could not open '%s'\n", ifname); @@ -697,7 +718,10 @@ static int tap_win32_init(NetClientState *peer, const char *model, s->handle = handle; - qemu_add_wait_object(s->handle->tap_semaphore, tap_win32_send, s); + nsrc = event_source_new(s->handle->tap_semaphore, tap_win32_handler, s); + nsrc->gfd.events = G_IO_IN; + s->nsrc = nsrc; + nc->info->bind_ctx(&s->nc, NULL); return 0; } -- 1.7.4.4