[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: |
Paolo Bonzini |
Subject: |
Re: [Qemu-devel] [PATCH V4] qemu-char: Add qemu_chr_add_handlers_full() for GMaincontext |
Date: |
Wed, 10 Aug 2016 16:57:40 +0200 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.2.0 |
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.
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);
>> }
>> }
>>
>