From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([208.118.235.92]:60447) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UZald-00033X-36 for qemu-devel@nongnu.org; Tue, 07 May 2013 01:48:50 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1UZalc-0007km-36 for qemu-devel@nongnu.org; Tue, 07 May 2013 01:48:49 -0400 Received: from mail-pa0-f48.google.com ([209.85.220.48]:62141) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UZalb-0007jJ-TC for qemu-devel@nongnu.org; Tue, 07 May 2013 01:48:48 -0400 Received: by mail-pa0-f48.google.com with SMTP id kp6so235681pab.7 for ; Mon, 06 May 2013 22:48:47 -0700 (PDT) From: Liu Ping Fan Date: Tue, 7 May 2013 13:46:54 +0800 Message-Id: <1367905622-21038-7-git-send-email-qemulist@gmail.com> In-Reply-To: <1367905622-21038-1-git-send-email-qemulist@gmail.com> References: <1367905622-21038-1-git-send-email-qemulist@gmail.com> Subject: [Qemu-devel] [PATCH v1 06/14] 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 , Jan Kiszka , Stefan Hajnoczi , Anthony Liguori , Paolo Bonzini From: Liu Ping Fan Signed-off-by: Liu Ping Fan --- net/tap-win32.c | 31 +++++++++++++++++++++++++++++-- 1 files changed, 29 insertions(+), 2 deletions(-) diff --git a/net/tap-win32.c b/net/tap-win32.c index 91e9e84..7a84195 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,13 +670,37 @@ 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 gushort readable(void *opaque) +{ + return G_IO_IN; +} + static int tap_win32_init(NetClientState *peer, const char *model, const char *name, const char *ifname) { @@ -697,7 +722,9 @@ 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); + s->nsrc = event_source_new(s->handle->tap_semaphore, tap_win32_handler, s); + s->nsrc->readable = readable; + nc->info->bind_ctx(&s->nc, NULL); return 0; } -- 1.7.4.4