qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH V4] qemu-char: Add qemu_chr_add_handlers_full()


From: Zhang Chen
Subject: Re: [Qemu-devel] [PATCH V4] qemu-char: Add qemu_chr_add_handlers_full() for GMaincontext
Date: Mon, 15 Aug 2016 10:17:25 +0800
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.2.0



On 08/10/2016 10:57 PM, Paolo Bonzini wrote:

On 10/08/2016 10:16, Zhang Chen wrote:
Hi~ paolo~~

Just a ping...

Have any comments for this patch?
Same as before: the patch is pointless alone, it makes sense to include
it as part of CoLo, if CoLo needs it.

OK, I will move this patch to colo-compare series as the first patch.

Thanks
Zhang Chen


Paolo

Thanks
Zhang Chen


On 08/04/2016 04:49 PM, Zhang Chen wrote:
Add qemu_chr_add_handlers_full() API, we can use
this API pass in a GMainContext,make handler run
in the context rather than main_loop.
This comments from Daniel P . Berrange.

Signed-off-by: Zhang Chen <address@hidden>
Signed-off-by: Li Zhijian <address@hidden>
Signed-off-by: Wen Congyang <address@hidden>

Reviewed-by: Daniel P. Berrange <address@hidden>

---
   include/sysemu/char.h | 11 +++++++-
   qemu-char.c           | 77
+++++++++++++++++++++++++++++++++++----------------
   2 files changed, 63 insertions(+), 25 deletions(-)

diff --git a/include/sysemu/char.h b/include/sysemu/char.h
index 307fd8f..f997849 100644
--- a/include/sysemu/char.h
+++ b/include/sysemu/char.h
@@ -65,7 +65,8 @@ struct CharDriverState {
       int (*chr_sync_read)(struct CharDriverState *s,
                            const uint8_t *buf, int len);
       GSource *(*chr_add_watch)(struct CharDriverState *s,
GIOCondition cond);
-    void (*chr_update_read_handler)(struct CharDriverState *s);
+    void (*chr_update_read_handler)(struct CharDriverState *s,
+                                    GMainContext *context);
       int (*chr_ioctl)(struct CharDriverState *s, int cmd, void *arg);
       int (*get_msgfds)(struct CharDriverState *s, int* fds, int num);
       int (*set_msgfds)(struct CharDriverState *s, int *fds, int num);
@@ -388,6 +389,14 @@ void qemu_chr_add_handlers(CharDriverState *s,
                              IOEventHandler *fd_event,
                              void *opaque);
   +/* This API can make handler run in the context what you pass to. */
+void qemu_chr_add_handlers_full(CharDriverState *s,
+                                IOCanReadHandler *fd_can_read,
+                                IOReadHandler *fd_read,
+                                IOEventHandler *fd_event,
+                                void *opaque,
+                                GMainContext *context);
+
   void qemu_chr_be_generic_open(CharDriverState *s);
   void qemu_chr_accept_input(CharDriverState *s);
   int qemu_chr_add_client(CharDriverState *s, int fd);
diff --git a/qemu-char.c b/qemu-char.c
index b597ee1..a926175 100644
--- a/qemu-char.c
+++ b/qemu-char.c
@@ -448,11 +448,12 @@ void qemu_chr_fe_printf(CharDriverState *s,
const char *fmt, ...)
     static void remove_fd_in_watch(CharDriverState *chr);
   -void qemu_chr_add_handlers(CharDriverState *s,
-                           IOCanReadHandler *fd_can_read,
-                           IOReadHandler *fd_read,
-                           IOEventHandler *fd_event,
-                           void *opaque)
+void qemu_chr_add_handlers_full(CharDriverState *s,
+                                IOCanReadHandler *fd_can_read,
+                                IOReadHandler *fd_read,
+                                IOEventHandler *fd_event,
+                                void *opaque,
+                                GMainContext *context)
   {
       int fe_open;
   @@ -466,8 +467,9 @@ void qemu_chr_add_handlers(CharDriverState *s,
       s->chr_read = fd_read;
       s->chr_event = fd_event;
       s->handler_opaque = opaque;
-    if (fe_open && s->chr_update_read_handler)
-        s->chr_update_read_handler(s);
+    if (fe_open && s->chr_update_read_handler) {
+        s->chr_update_read_handler(s, context);
+    }
         if (!s->explicit_fe_open) {
           qemu_chr_fe_set_open(s, fe_open);
@@ -480,6 +482,16 @@ void qemu_chr_add_handlers(CharDriverState *s,
       }
   }
   +void qemu_chr_add_handlers(CharDriverState *s,
+                           IOCanReadHandler *fd_can_read,
+                           IOReadHandler *fd_read,
+                           IOEventHandler *fd_event,
+                           void *opaque)
+{
+    qemu_chr_add_handlers_full(s, fd_can_read, fd_read,
+                               fd_event, opaque, NULL);
+}
+
   static int null_chr_write(CharDriverState *chr, const uint8_t *buf,
int len)
   {
       return len;
@@ -717,7 +729,8 @@ static void mux_chr_event(void *opaque, int event)
           mux_chr_send_event(d, i, event);
   }
   -static void mux_chr_update_read_handler(CharDriverState *chr)
+static void mux_chr_update_read_handler(CharDriverState *chr,
+                                        GMainContext *context)
   {
       MuxDriver *d = chr->opaque;
   @@ -731,8 +744,10 @@ static void
mux_chr_update_read_handler(CharDriverState *chr)
       d->chr_event[d->mux_cnt] = chr->chr_event;
       /* Fix up the real driver with mux routines */
       if (d->mux_cnt == 0) {
-        qemu_chr_add_handlers(d->drv, mux_chr_can_read, mux_chr_read,
-                              mux_chr_event, chr);
+        qemu_chr_add_handlers_full(d->drv, mux_chr_can_read,
+                                   mux_chr_read,
+                                   mux_chr_event,
+                                   chr, context);
       }
       if (d->focus != -1) {
           mux_chr_send_event(d, d->focus, CHR_EVENT_MUX_OUT);
@@ -840,6 +855,7 @@ typedef struct IOWatchPoll
       IOCanReadHandler *fd_can_read;
       GSourceFunc fd_read;
       void *opaque;
+    GMainContext *context;
   } IOWatchPoll;
     static IOWatchPoll *io_watch_poll_from_source(GSource *source)
@@ -847,7 +863,8 @@ static IOWatchPoll
*io_watch_poll_from_source(GSource *source)
       return container_of(source, IOWatchPoll, parent);
   }
   -static gboolean io_watch_poll_prepare(GSource *source, gint *timeout_)
+static gboolean io_watch_poll_prepare(GSource *source,
+                                      gint *timeout_)
   {
       IOWatchPoll *iwp = io_watch_poll_from_source(source);
       bool now_active = iwp->fd_can_read(iwp->opaque) > 0;
@@ -860,7 +877,7 @@ static gboolean io_watch_poll_prepare(GSource
*source, gint *timeout_)
           iwp->src = qio_channel_create_watch(
               iwp->ioc, G_IO_IN | G_IO_ERR | G_IO_HUP | G_IO_NVAL);
           g_source_set_callback(iwp->src, iwp->fd_read, iwp->opaque,
NULL);
-        g_source_attach(iwp->src, NULL);
+        g_source_attach(iwp->src, iwp->context);
       } else {
           g_source_destroy(iwp->src);
           g_source_unref(iwp->src);
@@ -907,19 +924,22 @@ static GSourceFuncs io_watch_poll_funcs = {
   static guint io_add_watch_poll(QIOChannel *ioc,
                                  IOCanReadHandler *fd_can_read,
                                  QIOChannelFunc fd_read,
-                               gpointer user_data)
+                               gpointer user_data,
+                               GMainContext *context)
   {
       IOWatchPoll *iwp;
       int tag;
   -    iwp = (IOWatchPoll *) g_source_new(&io_watch_poll_funcs,
sizeof(IOWatchPoll));
+    iwp = (IOWatchPoll *) g_source_new(&io_watch_poll_funcs,
+                                       sizeof(IOWatchPoll));
       iwp->fd_can_read = fd_can_read;
       iwp->opaque = user_data;
       iwp->ioc = ioc;
       iwp->fd_read = (GSourceFunc) fd_read;
       iwp->src = NULL;
+    iwp->context = context;
   -    tag = g_source_attach(&iwp->parent, NULL);
+    tag = g_source_attach(&iwp->parent, context);
       g_source_unref(&iwp->parent);
       return tag;
   }
@@ -1051,7 +1071,8 @@ static GSource *fd_chr_add_watch(CharDriverState
*chr, GIOCondition cond)
       return qio_channel_create_watch(s->ioc_out, cond);
   }
   -static void fd_chr_update_read_handler(CharDriverState *chr)
+static void fd_chr_update_read_handler(CharDriverState *chr,
+                                       GMainContext *context)
   {
       FDCharDriver *s = chr->opaque;
   @@ -1059,7 +1080,8 @@ static void
fd_chr_update_read_handler(CharDriverState *chr)
       if (s->ioc_in) {
           chr->fd_in_tag = io_add_watch_poll(s->ioc_in,
                                              fd_chr_read_poll,
-                                           fd_chr_read, chr);
+                                           fd_chr_read, chr,
+                                           context);
       }
   }
   @@ -1303,7 +1325,8 @@ static void
pty_chr_update_read_handler_locked(CharDriverState *chr)
       }
   }
   -static void pty_chr_update_read_handler(CharDriverState *chr)
+static void pty_chr_update_read_handler(CharDriverState *chr,
+                                        GMainContext *context)
   {
       qemu_mutex_lock(&chr->chr_write_lock);
       pty_chr_update_read_handler_locked(chr);
@@ -1407,7 +1430,8 @@ static void pty_chr_state(CharDriverState *chr,
int connected)
           if (!chr->fd_in_tag) {
               chr->fd_in_tag = io_add_watch_poll(s->ioc,
                                                  pty_chr_read_poll,
-                                               pty_chr_read, chr);
+                                               pty_chr_read,
+                                               chr, NULL);
           }
       }
   }
@@ -2546,7 +2570,8 @@ static gboolean udp_chr_read(QIOChannel *chan,
GIOCondition cond, void *opaque)
       return TRUE;
   }
   -static void udp_chr_update_read_handler(CharDriverState *chr)
+static void udp_chr_update_read_handler(CharDriverState *chr,
+                                        GMainContext *context)
   {
       NetCharDriver *s = chr->opaque;
   @@ -2554,7 +2579,8 @@ static void
udp_chr_update_read_handler(CharDriverState *chr)
       if (s->ioc) {
           chr->fd_in_tag = io_add_watch_poll(s->ioc,
                                              udp_chr_read_poll,
-                                           udp_chr_read, chr);
+                                           udp_chr_read, chr,
+                                           context);
       }
   }
   @@ -2931,12 +2957,14 @@ static void tcp_chr_connect(void *opaque)
       if (s->ioc) {
           chr->fd_in_tag = io_add_watch_poll(s->ioc,
                                              tcp_chr_read_poll,
-                                           tcp_chr_read, chr);
+                                           tcp_chr_read,
+                                           chr, NULL);
       }
       qemu_chr_be_generic_open(chr);
   }
   -static void tcp_chr_update_read_handler(CharDriverState *chr)
+static void tcp_chr_update_read_handler(CharDriverState *chr,
+                                        GMainContext *context)
   {
       TCPCharDriver *s = chr->opaque;
   @@ -2948,7 +2976,8 @@ static void
tcp_chr_update_read_handler(CharDriverState *chr)
       if (s->ioc) {
           chr->fd_in_tag = io_add_watch_poll(s->ioc,
                                              tcp_chr_read_poll,
-                                           tcp_chr_read, chr);
+                                           tcp_chr_read, chr,
+                                           context);
       }
   }

.


--
Thanks
zhangchen






reply via email to

[Prev in Thread] Current Thread [Next in Thread]