Commit 4ad6f6cb authored by Paolo Bonzini's avatar Paolo Bonzini Committed by Marc-André Lureau
Browse files

char: allow specifying a GMainContext at opening time



This will be needed by vhost-user-test, when each test switches to
its own GMainLoop and GMainContext.  Otherwise, for a reconnecting
socket the initial connection will happen on the default GMainContext,
and no one will be listening on it.

Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
Reviewed-by: default avatarDaniel P. Berrangé <berrange@redhat.com>
Message-Id: <20190202110834.24880-1-pbonzini@redhat.com>
Signed-off-by: default avatarMarc-André Lureau <marcandre.lureau@redhat.com>
parent 211ef6c4
Loading
Loading
Loading
Loading
+19 −13
Original line number Diff line number Diff line
@@ -636,7 +636,8 @@ ChardevBackend *qemu_chr_parse_opts(QemuOpts *opts, Error **errp)
    return backend;
}

Chardev *qemu_chr_new_from_opts(QemuOpts *opts, Error **errp)
Chardev *qemu_chr_new_from_opts(QemuOpts *opts, GMainContext *context,
                                Error **errp)
{
    const ChardevClass *cc;
    Chardev *chr = NULL;
@@ -676,7 +677,7 @@ Chardev *qemu_chr_new_from_opts(QemuOpts *opts, Error **errp)

    chr = qemu_chardev_new(bid ? bid : id,
                           object_class_get_name(OBJECT_CLASS(cc)),
                           backend, errp);
                           backend, context, errp);

    if (chr == NULL) {
        goto out;
@@ -689,7 +690,7 @@ Chardev *qemu_chr_new_from_opts(QemuOpts *opts, Error **errp)
        backend->type = CHARDEV_BACKEND_KIND_MUX;
        backend->u.mux.data = g_new0(ChardevMux, 1);
        backend->u.mux.data->chardev = g_strdup(bid);
        mux = qemu_chardev_new(id, TYPE_CHARDEV_MUX, backend, errp);
        mux = qemu_chardev_new(id, TYPE_CHARDEV_MUX, backend, context, errp);
        if (mux == NULL) {
            object_unparent(OBJECT(chr));
            chr = NULL;
@@ -705,7 +706,7 @@ out:
}

Chardev *qemu_chr_new_noreplay(const char *label, const char *filename,
                               bool permit_mux_mon)
                               bool permit_mux_mon, GMainContext *context)
{
    const char *p;
    Chardev *chr;
@@ -720,7 +721,7 @@ Chardev *qemu_chr_new_noreplay(const char *label, const char *filename,
    if (!opts)
        return NULL;

    chr = qemu_chr_new_from_opts(opts, &err);
    chr = qemu_chr_new_from_opts(opts, context, &err);
    if (!chr) {
        error_report_err(err);
        goto out;
@@ -738,10 +739,11 @@ out:

static Chardev *qemu_chr_new_permit_mux_mon(const char *label,
                                          const char *filename,
                                          bool permit_mux_mon)
                                          bool permit_mux_mon,
                                          GMainContext *context)
{
    Chardev *chr;
    chr = qemu_chr_new_noreplay(label, filename, permit_mux_mon);
    chr = qemu_chr_new_noreplay(label, filename, permit_mux_mon, context);
    if (chr) {
        if (replay_mode != REPLAY_MODE_NONE) {
            qemu_chr_set_feature(chr, QEMU_CHAR_FEATURE_REPLAY);
@@ -755,14 +757,16 @@ static Chardev *qemu_chr_new_permit_mux_mon(const char *label,
    return chr;
}

Chardev *qemu_chr_new(const char *label, const char *filename)
Chardev *qemu_chr_new(const char *label, const char *filename,
                      GMainContext *context)
{
    return qemu_chr_new_permit_mux_mon(label, filename, false);
    return qemu_chr_new_permit_mux_mon(label, filename, false, context);
}

Chardev *qemu_chr_new_mux_mon(const char *label, const char *filename)
Chardev *qemu_chr_new_mux_mon(const char *label, const char *filename,
                              GMainContext *context)
{
    return qemu_chr_new_permit_mux_mon(label, filename, true);
    return qemu_chr_new_permit_mux_mon(label, filename, true, context);
}

static int qmp_query_chardev_foreach(Object *obj, void *data)
@@ -937,6 +941,7 @@ void qemu_chr_set_feature(Chardev *chr,

Chardev *qemu_chardev_new(const char *id, const char *typename,
                          ChardevBackend *backend,
                          GMainContext *gcontext,
                          Error **errp)
{
    Object *obj;
@@ -949,6 +954,7 @@ Chardev *qemu_chardev_new(const char *id, const char *typename,
    obj = object_new(typename);
    chr = CHARDEV(obj);
    chr->label = g_strdup(id);
    chr->gcontext = gcontext;

    qemu_char_open(chr, backend, &be_opened, &local_err);
    if (local_err) {
@@ -993,7 +999,7 @@ ChardevReturn *qmp_chardev_add(const char *id, ChardevBackend *backend,
    }

    chr = qemu_chardev_new(id, object_class_get_name(OBJECT_CLASS(cc)),
                           backend, errp);
                           backend, NULL, errp);
    if (!chr) {
        return NULL;
    }
@@ -1051,7 +1057,7 @@ ChardevReturn *qmp_chardev_change(const char *id, ChardevBackend *backend,
    }

    chr_new = qemu_chardev_new(NULL, object_class_get_name(OBJECT_CLASS(cc)),
                               backend, errp);
                               backend, chr->gcontext, errp);
    if (!chr_new) {
        return NULL;
    }
+2 −2
Original line number Diff line number Diff line
@@ -2531,7 +2531,7 @@ int gdbserver_start(const char *device)
         * FIXME: it's a bit weird to allow using a mux chardev here
         * and implicitly setup a monitor. We may want to break this.
         */
        chr = qemu_chr_new_noreplay("gdb", device, true);
        chr = qemu_chr_new_noreplay("gdb", device, true, NULL);
        if (!chr)
            return -1;
    }
@@ -2545,7 +2545,7 @@ int gdbserver_start(const char *device)

        /* Initialize a monitor terminal for gdb */
        mon_chr = qemu_chardev_new(NULL, TYPE_CHARDEV_GDB,
                                   NULL, &error_abort);
                                   NULL, NULL, &error_abort);
        monitor_init(mon_chr, 0);
    } else {
        qemu_chr_fe_deinit(&s->chr, true);
+1 −1
Original line number Diff line number Diff line
@@ -2395,7 +2395,7 @@ void hmp_chardev_add(Monitor *mon, const QDict *qdict)
    if (opts == NULL) {
        error_setg(&err, "Parsing chardev args failed");
    } else {
        qemu_chr_new_from_opts(opts, &err);
        qemu_chr_new_from_opts(opts, NULL, &err);
        qemu_opts_del(opts);
    }
    hmp_handle_error(mon, &err);
+1 −1
Original line number Diff line number Diff line
@@ -799,7 +799,7 @@ static struct omap_sti_s *omap_sti_init(struct omap_target_agent_s *ta,
    s->irq = irq;
    omap_sti_reset(s);

    qemu_chr_fe_init(&s->chr, chr ?: qemu_chr_new("null", "null"),
    qemu_chr_fe_init(&s->chr, chr ?: qemu_chr_new("null", "null", NULL),
                     &error_abort);

    memory_region_init_io(&s->iomem, NULL, &omap_sti_ops, s, "omap.sti",
+1 −1
Original line number Diff line number Diff line
@@ -501,7 +501,7 @@ static const TypeInfo char_hci_type_info = {
Chardev *uart_hci_init(void)
{
    return qemu_chardev_new(NULL, TYPE_CHARDEV_HCI,
                            NULL, &error_abort);
                            NULL, NULL, &error_abort);
}

static void register_types(void)
Loading