Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/2196268/?format=api
{ "id": 2196268, "url": "http://patchwork.ozlabs.org/api/patches/2196268/?format=api", "web_url": "http://patchwork.ozlabs.org/project/qemu-devel/patch/20260213094938.4074478-7-marcandre.lureau@redhat.com/", "project": { "id": 14, "url": "http://patchwork.ozlabs.org/api/projects/14/?format=api", "name": "QEMU Development", "link_name": "qemu-devel", "list_id": "qemu-devel.nongnu.org", "list_email": "qemu-devel@nongnu.org", "web_url": "", "scm_url": "", "webscm_url": "", "list_archive_url": "", "list_archive_url_format": "", "commit_url_format": "" }, "msgid": "<20260213094938.4074478-7-marcandre.lureau@redhat.com>", "list_archive_url": null, "date": "2026-02-13T09:49:25", "name": "[PULL,v2,06/15] chardev: .chr_open(): drop be_opened parameter", "commit_ref": null, "pull_url": null, "state": "new", "archived": false, "hash": "0879035123a2ebded1b84720a3c0d3357d128ab9", "submitter": { "id": 66774, "url": "http://patchwork.ozlabs.org/api/people/66774/?format=api", "name": "Marc-André Lureau", "email": "marcandre.lureau@redhat.com" }, "delegate": null, "mbox": "http://patchwork.ozlabs.org/project/qemu-devel/patch/20260213094938.4074478-7-marcandre.lureau@redhat.com/mbox/", "series": [ { "id": 492070, "url": "http://patchwork.ozlabs.org/api/series/492070/?format=api", "web_url": "http://patchwork.ozlabs.org/project/qemu-devel/list/?series=492070", "date": "2026-02-13T09:49:19", "name": "[PULL,v2,01/15] char-udp: Fix initial backend open status", "version": 2, "mbox": "http://patchwork.ozlabs.org/series/492070/mbox/" } ], "comments": "http://patchwork.ozlabs.org/api/patches/2196268/comments/", "check": "pending", "checks": "http://patchwork.ozlabs.org/api/patches/2196268/checks/", "tags": {}, "related": [], "headers": { "Return-Path": "<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>", "X-Original-To": "incoming@patchwork.ozlabs.org", "Delivered-To": "patchwork-incoming@legolas.ozlabs.org", "Authentication-Results": [ "legolas.ozlabs.org;\n\tdkim=pass (1024-bit key;\n unprotected) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256\n header.s=mimecast20190719 header.b=iRpGfDus;\n\tdkim-atps=neutral", "legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=nongnu.org\n (client-ip=209.51.188.17; helo=lists.gnu.org;\n envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org;\n receiver=patchwork.ozlabs.org)" ], "Received": [ "from lists.gnu.org (lists.gnu.org [209.51.188.17])\n\t(using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits))\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4fC6rZ5bC1z1xpl\n\tfor <incoming@patchwork.ozlabs.org>; Fri, 13 Feb 2026 20:51:42 +1100 (AEDT)", "from localhost ([::1] helo=lists1p.gnu.org)\n\tby lists.gnu.org with esmtp (Exim 4.90_1)\n\t(envelope-from <qemu-devel-bounces@nongnu.org>)\n\tid 1vqpop-0007NC-Cl; Fri, 13 Feb 2026 04:50:35 -0500", "from eggs.gnu.org ([2001:470:142:3::10])\n by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)\n (Exim 4.90_1) (envelope-from <marcandre.lureau@redhat.com>)\n id 1vqpob-000729-6n\n for qemu-devel@nongnu.org; Fri, 13 Feb 2026 04:50:23 -0500", "from us-smtp-delivery-124.mimecast.com ([170.10.129.124])\n by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)\n (Exim 4.90_1) (envelope-from <marcandre.lureau@redhat.com>)\n id 1vqpoY-0007Hs-1B\n for qemu-devel@nongnu.org; Fri, 13 Feb 2026 04:50:20 -0500", "from mx-prod-mc-03.mail-002.prod.us-west-2.aws.redhat.com\n (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by\n relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3,\n cipher=TLS_AES_256_GCM_SHA384) id us-mta-249-ccQBv4M4MaqY0leUR4BYzQ-1; Fri,\n 13 Feb 2026 04:50:14 -0500", "from mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com\n (mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.111])\n (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest\n SHA256)\n (No client certificate requested)\n by mx-prod-mc-03.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS\n id 1922E18826AB; Fri, 13 Feb 2026 09:50:04 +0000 (UTC)", "from localhost (unknown [10.44.22.41])\n by mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP\n id 41D371800352; Fri, 13 Feb 2026 09:50:01 +0000 (UTC)" ], "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com;\n s=mimecast20190719; t=1770976216;\n h=from:from:reply-to:subject:subject:date:date:message-id:message-id:\n to:to:cc:cc:mime-version:mime-version:content-type:content-type:\n content-transfer-encoding:content-transfer-encoding:\n in-reply-to:in-reply-to:references:references;\n bh=ARe11uBwUQtZK+r/LyMwdLX8qnRbouC5icUkGH7AqSA=;\n b=iRpGfDuss945/1ylz3O+55RINszkX9K5HkS8CtbbqKQI7jjnFzEImEmnS0A3NLfwnmh2iQ\n PO4TqmjX4+iyABIpQmLK9/giwe/HiLQl+s4JVQc61FqUTEYq+3YfLbWcyh3AmHG1AX+ed9\n 4CW5Pknlr1jSUWTJ5iVMlisB8kDxdsA=", "X-MC-Unique": "ccQBv4M4MaqY0leUR4BYzQ-1", "X-Mimecast-MFC-AGG-ID": "ccQBv4M4MaqY0leUR4BYzQ_1770976212", "From": "marcandre.lureau@redhat.com", "To": "qemu-devel@nongnu.org", "Cc": "=?utf-8?q?Alex_Benn=C3=A9e?= <alex.bennee@linaro.org>,\n \"Edgar E. Iglesias\" <edgar.iglesias@gmail.com>, =?utf-8?q?Daniel_P=2E_Berra?=\n\t=?utf-8?q?ng=C3=A9?= <berrange@redhat.com>, Eric Blake <eblake@redhat.com>,\n Markus Armbruster <armbru@redhat.com>, Paul Durrant <paul@xen.org>,\n Anthony PERARD <anthony@xenproject.org>, =?utf-8?q?Philippe_Mathieu-Daud?=\n\t=?utf-8?q?=C3=A9?= <philmd@linaro.org>,\n Eduardo Habkost <eduardo@habkost.net>, Paolo Bonzini <pbonzini@redhat.com>,\n\t=?utf-8?q?Marc-Andr=C3=A9_Lureau?= <marcandre.lureau@redhat.com>,\n Stefano Stabellini <sstabellini@kernel.org>, xen-devel@lists.xenproject.org,\n Samuel Thibault <samuel.thibault@ens-lyon.org>,\n Vladimir Sementsov-Ogievskiy <vsementsov@yandex-team.ru>", "Subject": "[PULL v2 06/15] chardev: .chr_open(): drop be_opened parameter", "Date": "Fri, 13 Feb 2026 10:49:25 +0100", "Message-ID": "<20260213094938.4074478-7-marcandre.lureau@redhat.com>", "In-Reply-To": "<20260213094938.4074478-1-marcandre.lureau@redhat.com>", "References": "<20260213094938.4074478-1-marcandre.lureau@redhat.com>", "MIME-Version": "1.0", "Content-Type": "text/plain; charset=UTF-8", "Content-Transfer-Encoding": "8bit", "X-Scanned-By": "MIMEDefang 3.4.1 on 10.30.177.111", "Received-SPF": "pass client-ip=170.10.129.124;\n envelope-from=marcandre.lureau@redhat.com;\n helo=us-smtp-delivery-124.mimecast.com", "X-Spam_score_int": "-20", "X-Spam_score": "-2.1", "X-Spam_bar": "--", "X-Spam_report": "(-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001,\n DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1,\n RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001,\n RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, RCVD_IN_VALIDITY_SAFE_BLOCKED=0.001,\n SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no", "X-Spam_action": "no action", "X-BeenThere": "qemu-devel@nongnu.org", "X-Mailman-Version": "2.1.29", "Precedence": "list", "List-Id": "qemu development <qemu-devel.nongnu.org>", "List-Unsubscribe": "<https://lists.nongnu.org/mailman/options/qemu-devel>,\n <mailto:qemu-devel-request@nongnu.org?subject=unsubscribe>", "List-Archive": "<https://lists.nongnu.org/archive/html/qemu-devel>", "List-Post": "<mailto:qemu-devel@nongnu.org>", "List-Help": "<mailto:qemu-devel-request@nongnu.org?subject=help>", "List-Subscribe": "<https://lists.nongnu.org/mailman/listinfo/qemu-devel>,\n <mailto:qemu-devel-request@nongnu.org?subject=subscribe>", "Errors-To": "qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org", "Sender": "qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org" }, "content": "From: Vladimir Sementsov-Ogievskiy <vsementsov@yandex-team.ru>\n\nThe logic around the parameter is rather tricky. Let's instead\nexplicitly send CHR_EVENT_OPENED in all backends where needed.\n\nSigned-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@yandex-team.ru>\n[ Marc-André - add CHR_EVENT_OPENED in udp_chr_open() ]\nSigned-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>\nMessage-Id: <20260115144606.233252-6-vsementsov@yandex-team.ru>\n---\n include/chardev/char.h | 3 +--\n chardev/baum.c | 7 +++----\n chardev/char-console.c | 5 ++---\n chardev/char-file.c | 7 +++----\n chardev/char-hub.c | 11 +++++------\n chardev/char-mux.c | 19 +++++++++++--------\n chardev/char-null.c | 7 ++-----\n chardev/char-parallel.c | 15 ++++-----------\n chardev/char-pipe.c | 14 ++++++--------\n chardev/char-pty.c | 6 +-----\n chardev/char-ringbuf.c | 3 ++-\n chardev/char-serial.c | 18 +++++++++---------\n chardev/char-socket.c | 10 +++-------\n chardev/char-stdio.c | 7 +++----\n chardev/char-udp.c | 6 ++----\n chardev/char-win-stdio.c | 2 +-\n chardev/char.c | 11 +++--------\n chardev/msmouse.c | 4 ++--\n chardev/spice.c | 10 ++--------\n chardev/wctablet.c | 5 ++---\n gdbstub/system.c | 5 ++---\n ui/console-vc.c | 7 ++-----\n ui/dbus-chardev.c | 6 ++----\n ui/gtk.c | 9 +++------\n ui/spice-app.c | 10 +++-------\n ui/vdagent.c | 3 +--\n 26 files changed, 80 insertions(+), 130 deletions(-)", "diff": "diff --git a/include/chardev/char.h b/include/chardev/char.h\nindex d33833b6c02..aa42e01b8a3 100644\n--- a/include/chardev/char.h\n+++ b/include/chardev/char.h\n@@ -260,8 +260,7 @@ struct ChardevClass {\n void (*chr_parse)(QemuOpts *opts, ChardevBackend *backend, Error **errp);\n \n /* called after construction, open/starts the backend */\n- void (*chr_open)(Chardev *chr, ChardevBackend *backend,\n- bool *be_opened, Error **errp);\n+ void (*chr_open)(Chardev *chr, ChardevBackend *backend, Error **errp);\n \n /* write buf to the backend */\n int (*chr_write)(Chardev *s, const uint8_t *buf, int len);\ndiff --git a/chardev/baum.c b/chardev/baum.c\nindex 75e41965c11..4b97d630ffb 100644\n--- a/chardev/baum.c\n+++ b/chardev/baum.c\n@@ -642,10 +642,7 @@ static void char_braille_finalize(Object *obj)\n }\n }\n \n-static void baum_chr_open(Chardev *chr,\n- ChardevBackend *backend,\n- bool *be_opened,\n- Error **errp)\n+static void baum_chr_open(Chardev *chr, ChardevBackend *backend, Error **errp)\n {\n BaumChardev *baum = BAUM_CHARDEV(chr);\n brlapi_handle_t *handle;\n@@ -670,6 +667,8 @@ static void baum_chr_open(Chardev *chr,\n * as an integer, but in practice it seems to work\n */\n qemu_set_fd_handler(baum->brlapi_fd, baum_chr_read, NULL, baum);\n+\n+ qemu_chr_be_event(chr, CHR_EVENT_OPENED);\n }\n \n static void char_braille_class_init(ObjectClass *oc, const void *data)\ndiff --git a/chardev/char-console.c b/chardev/char-console.c\nindex f3ef1a7748c..423f0f4cc4e 100644\n--- a/chardev/char-console.c\n+++ b/chardev/char-console.c\n@@ -26,12 +26,11 @@\n #include \"chardev/char-win.h\"\n #include \"qemu/module.h\"\n \n-static void console_chr_open(Chardev *chr,\n- ChardevBackend *backend,\n- bool *be_opened,\n+static void console_chr_open(Chardev *chr, ChardevBackend *backend,\n Error **errp)\n {\n win_chr_set_file(chr, GetStdHandle(STD_OUTPUT_HANDLE), true);\n+ qemu_chr_be_event(chr, CHR_EVENT_OPENED);\n }\n \n static void char_console_class_init(ObjectClass *oc, const void *data)\ndiff --git a/chardev/char-file.c b/chardev/char-file.c\nindex 568600bb7c4..34ef386abc5 100644\n--- a/chardev/char-file.c\n+++ b/chardev/char-file.c\n@@ -34,10 +34,7 @@\n #include \"chardev/char-fd.h\"\n #endif\n \n-static void file_chr_open(Chardev *chr,\n- ChardevBackend *backend,\n- bool *be_opened,\n- Error **errp)\n+static void file_chr_open(Chardev *chr, ChardevBackend *backend, Error **errp)\n {\n ChardevFile *file = backend->u.file.data;\n #ifdef _WIN32\n@@ -100,6 +97,8 @@ static void file_chr_open(Chardev *chr,\n return;\n }\n #endif\n+\n+ qemu_chr_be_event(chr, CHR_EVENT_OPENED);\n }\n \n static void file_chr_parse(QemuOpts *opts, ChardevBackend *backend,\ndiff --git a/chardev/char-hub.c b/chardev/char-hub.c\nindex 11556dfa72b..aa6058c2f6f 100644\n--- a/chardev/char-hub.c\n+++ b/chardev/char-hub.c\n@@ -203,10 +203,7 @@ static void hub_chr_update_read_handlers(Chardev *chr)\n }\n }\n \n-static void hub_chr_open(Chardev *chr,\n- ChardevBackend *backend,\n- bool *be_opened,\n- Error **errp)\n+static void hub_chr_open(Chardev *chr, ChardevBackend *backend, Error **errp)\n {\n ChardevHub *hub = backend->u.hub.data;\n HubChardev *d = HUB_CHARDEV(chr);\n@@ -241,8 +238,10 @@ static void hub_chr_open(Chardev *chr,\n list = list->next;\n }\n \n- /* Closed until an explicit event from backend */\n- *be_opened = false;\n+ /*\n+ * Closed until an explicit event from backend, so we don't\n+ * send CHR_EVENT_OPENED now.\n+ */\n }\n \n static void hub_chr_parse(QemuOpts *opts, ChardevBackend *backend, Error **errp)\ndiff --git a/chardev/char-mux.c b/chardev/char-mux.c\nindex f38d66b21f1..7210df431fc 100644\n--- a/chardev/char-mux.c\n+++ b/chardev/char-mux.c\n@@ -361,10 +361,7 @@ void mux_set_focus(Chardev *chr, unsigned int focus)\n mux_chr_send_event(d, d->focus, CHR_EVENT_MUX_IN);\n }\n \n-static void mux_chr_open(Chardev *chr,\n- ChardevBackend *backend,\n- bool *be_opened,\n- Error **errp)\n+static void mux_chr_open(Chardev *chr, ChardevBackend *backend, Error **errp)\n {\n ChardevMux *mux = backend->u.mux.data;\n Chardev *drv;\n@@ -377,11 +374,17 @@ static void mux_chr_open(Chardev *chr,\n }\n \n d->focus = -1;\n- /* only default to opened state if we've realized the initial\n- * set of muxes\n+ if (!qemu_chr_fe_init(&d->chr, drv, errp)) {\n+ return;\n+ }\n+\n+ /*\n+ * Only move to opened state if we've realized\n+ * the initial set of muxes:\n */\n- *be_opened = muxes_opened;\n- qemu_chr_fe_init(&d->chr, drv, errp);\n+ if (muxes_opened) {\n+ qemu_chr_be_event(chr, CHR_EVENT_OPENED);\n+ }\n }\n \n static void mux_chr_parse(QemuOpts *opts, ChardevBackend *backend, Error **errp)\ndiff --git a/chardev/char-null.c b/chardev/char-null.c\nindex 674603b3807..900b5febb6c 100644\n--- a/chardev/char-null.c\n+++ b/chardev/char-null.c\n@@ -26,12 +26,9 @@\n #include \"chardev/char.h\"\n #include \"qemu/module.h\"\n \n-static void null_chr_open(Chardev *chr,\n- ChardevBackend *backend,\n- bool *be_opened,\n- Error **errp)\n+static void null_chr_open(Chardev *chr, ChardevBackend *backend, Error **errp)\n {\n- *be_opened = false;\n+ /* do not send CHR_EVENT_OPENED */\n }\n \n static void char_null_class_init(ObjectClass *oc, const void *data)\ndiff --git a/chardev/char-parallel.c b/chardev/char-parallel.c\nindex 1be1ef46292..359efa3c9c8 100644\n--- a/chardev/char-parallel.c\n+++ b/chardev/char-parallel.c\n@@ -157,10 +157,7 @@ static int parallel_chr_ioctl(Chardev *chr, int cmd, void *arg)\n return 0;\n }\n \n-static void parallel_chr_open_fd(Chardev *chr,\n- int fd,\n- bool *be_opened,\n- Error **errp)\n+static void parallel_chr_open_fd(Chardev *chr, int fd, Error **errp)\n {\n ParallelChardev *drv = PARALLEL_CHARDEV(chr);\n \n@@ -172,6 +169,7 @@ static void parallel_chr_open_fd(Chardev *chr,\n }\n \n drv->mode = IEEE1284_MODE_COMPAT;\n+ qemu_chr_be_event(chr, CHR_EVENT_OPENED);\n }\n #endif /* __linux__ */\n \n@@ -227,21 +225,16 @@ static int parallel_chr_ioctl(Chardev *chr, int cmd, void *arg)\n return 0;\n }\n \n-static void parallel_chr_open_fd(Chardev *chr,\n- int fd,\n- bool *be_opened,\n- Error **errp)\n+static void parallel_chr_open_fd(Chardev *chr, int fd, Error **errp)\n {\n ParallelChardev *drv = PARALLEL_CHARDEV(chr);\n drv->fd = fd;\n- *be_opened = false;\n }\n #endif\n \n #ifdef HAVE_CHARDEV_PARALLEL\n static void parallel_chr_open(Chardev *chr,\n ChardevBackend *backend,\n- bool *be_opened,\n Error **errp)\n {\n ChardevHostdev *parallel = backend->u.parallel.data;\n@@ -251,7 +244,7 @@ static void parallel_chr_open(Chardev *chr,\n if (fd < 0) {\n return;\n }\n- parallel_chr_open_fd(chr, fd, be_opened, errp);\n+ parallel_chr_open_fd(chr, fd, errp);\n }\n \n static void parallel_chr_parse(QemuOpts *opts, ChardevBackend *backend,\ndiff --git a/chardev/char-pipe.c b/chardev/char-pipe.c\nindex e84492d42b6..2f26372dfc9 100644\n--- a/chardev/char-pipe.c\n+++ b/chardev/char-pipe.c\n@@ -103,10 +103,7 @@ static int win_chr_pipe_init(Chardev *chr, const char *filename,\n return -1;\n }\n \n-static void pipe_chr_open(Chardev *chr,\n- ChardevBackend *backend,\n- bool *be_opened,\n- Error **errp)\n+static void pipe_chr_open(Chardev *chr, ChardevBackend *backend, Error **errp)\n {\n ChardevHostdev *opts = backend->u.pipe.data;\n const char *filename = opts->device;\n@@ -114,14 +111,13 @@ static void pipe_chr_open(Chardev *chr,\n if (win_chr_pipe_init(chr, filename, errp) < 0) {\n return;\n }\n+\n+ qemu_chr_be_event(chr, CHR_EVENT_OPENED);\n }\n \n #else\n \n-static void pipe_chr_open(Chardev *chr,\n- ChardevBackend *backend,\n- bool *be_opened,\n- Error **errp)\n+static void pipe_chr_open(Chardev *chr, ChardevBackend *backend, Error **errp)\n {\n ChardevHostdev *opts = backend->u.pipe.data;\n int fd_in, fd_out;\n@@ -158,6 +154,8 @@ static void pipe_chr_open(Chardev *chr,\n }\n return;\n }\n+\n+ qemu_chr_be_event(chr, CHR_EVENT_OPENED);\n }\n \n #endif /* !_WIN32 */\ndiff --git a/chardev/char-pty.c b/chardev/char-pty.c\nindex 909ab01f5f2..d4d69a29a95 100644\n--- a/chardev/char-pty.c\n+++ b/chardev/char-pty.c\n@@ -331,10 +331,7 @@ static int qemu_openpty_raw(int *aslave, char *pty_name)\n return amaster;\n }\n \n-static void pty_chr_open(Chardev *chr,\n- ChardevBackend *backend,\n- bool *be_opened,\n- Error **errp)\n+static void pty_chr_open(Chardev *chr, ChardevBackend *backend, Error **errp)\n {\n PtyChardev *s;\n int master_fd, slave_fd;\n@@ -364,7 +361,6 @@ static void pty_chr_open(Chardev *chr,\n qio_channel_set_name(s->ioc, name);\n g_free(name);\n s->timer_src = NULL;\n- *be_opened = false;\n \n /* create symbolic link */\n if (path) {\ndiff --git a/chardev/char-ringbuf.c b/chardev/char-ringbuf.c\nindex 19652fe2b3a..30b17a96d3a 100644\n--- a/chardev/char-ringbuf.c\n+++ b/chardev/char-ringbuf.c\n@@ -94,7 +94,6 @@ static void char_ringbuf_finalize(Object *obj)\n \n static void ringbuf_chr_open(Chardev *chr,\n ChardevBackend *backend,\n- bool *be_opened,\n Error **errp)\n {\n ChardevRingbuf *opts = backend->u.ringbuf.data;\n@@ -111,6 +110,8 @@ static void ringbuf_chr_open(Chardev *chr,\n d->prod = 0;\n d->cons = 0;\n d->cbuf = g_malloc0(d->size);\n+\n+ qemu_chr_be_event(chr, CHR_EVENT_OPENED);\n }\n \n void qmp_ringbuf_write(const char *device, const char *data,\ndiff --git a/chardev/char-serial.c b/chardev/char-serial.c\nindex 54c2b3935cf..9995f184258 100644\n--- a/chardev/char-serial.c\n+++ b/chardev/char-serial.c\n@@ -41,14 +41,15 @@\n \n #ifdef _WIN32\n \n-static void serial_chr_open(Chardev *chr,\n- ChardevBackend *backend,\n- bool *be_opened,\n- Error **errp)\n+static void serial_chr_open(Chardev *chr, ChardevBackend *backend, Error **errp)\n {\n ChardevHostdev *serial = backend->u.serial.data;\n+ int ret = win_chr_serial_init(chr, serial->device, errp);\n+ if (ret < 0) {\n+ return;\n+ }\n \n- win_chr_serial_init(chr, serial->device, errp);\n+ qemu_chr_be_event(chr, CHR_EVENT_OPENED);\n }\n \n #elif defined(__linux__) || defined(__sun__) || defined(__FreeBSD__) \\\n@@ -258,10 +259,7 @@ static int serial_chr_ioctl(Chardev *chr, int cmd, void *arg)\n return 0;\n }\n \n-static void serial_chr_open(Chardev *chr,\n- ChardevBackend *backend,\n- bool *be_opened,\n- Error **errp)\n+static void serial_chr_open(Chardev *chr, ChardevBackend *backend, Error **errp)\n {\n ChardevHostdev *serial = backend->u.serial.data;\n int fd;\n@@ -281,6 +279,8 @@ static void serial_chr_open(Chardev *chr,\n close(fd);\n return;\n }\n+\n+ qemu_chr_be_event(chr, CHR_EVENT_OPENED);\n }\n #endif /* __linux__ || __sun__ */\n \ndiff --git a/chardev/char-socket.c b/chardev/char-socket.c\nindex a3203f2f97b..2951b2ec9be 100644\n--- a/chardev/char-socket.c\n+++ b/chardev/char-socket.c\n@@ -1365,10 +1365,7 @@ static bool qmp_chardev_validate_socket(ChardevSocket *sock,\n }\n \n \n-static void tcp_chr_open(Chardev *chr,\n- ChardevBackend *backend,\n- bool *be_opened,\n- Error **errp)\n+static void tcp_chr_open(Chardev *chr, ChardevBackend *backend, Error **errp)\n {\n SocketChardev *s = SOCKET_CHARDEV(chr);\n ChardevSocket *sock = backend->u.socket.data;\n@@ -1439,9 +1436,6 @@ static void tcp_chr_open(Chardev *chr,\n }\n s->registered_yank = true;\n \n- /* be isn't opened until we get a connection */\n- *be_opened = false;\n-\n update_disconnected_filename(s);\n \n if (s->is_listen) {\n@@ -1454,6 +1448,8 @@ static void tcp_chr_open(Chardev *chr,\n return;\n }\n }\n+\n+ /* be isn't opened until we get a connection */\n }\n \n static void tcp_chr_parse(QemuOpts *opts, ChardevBackend *backend, Error **errp)\ndiff --git a/chardev/char-stdio.c b/chardev/char-stdio.c\nindex f0920a23faa..534f6ed5658 100644\n--- a/chardev/char-stdio.c\n+++ b/chardev/char-stdio.c\n@@ -85,10 +85,7 @@ static void term_stdio_handler(int sig)\n stdio_chr_set_echo(NULL, stdio_echo_state);\n }\n \n-static void stdio_chr_open(Chardev *chr,\n- ChardevBackend *backend,\n- bool *be_opened,\n- Error **errp)\n+static void stdio_chr_open(Chardev *chr, ChardevBackend *backend, Error **errp)\n {\n ChardevStdio *opts = backend->u.stdio.data;\n struct sigaction act;\n@@ -123,6 +120,8 @@ static void stdio_chr_open(Chardev *chr,\n \n stdio_allow_signal = !opts->has_signal || opts->signal;\n stdio_chr_set_echo(chr, false);\n+\n+ qemu_chr_be_event(chr, CHR_EVENT_OPENED);\n }\n #endif\n \ndiff --git a/chardev/char-udp.c b/chardev/char-udp.c\nindex 18f4322408a..4c81c95e656 100644\n--- a/chardev/char-udp.c\n+++ b/chardev/char-udp.c\n@@ -188,10 +188,7 @@ static void udp_chr_parse(QemuOpts *opts, ChardevBackend *backend, Error **errp)\n }\n }\n \n-static void upd_chr_open(Chardev *chr,\n- ChardevBackend *backend,\n- bool *be_opened,\n- Error **errp)\n+static void upd_chr_open(Chardev *chr, ChardevBackend *backend, Error **errp)\n {\n ChardevUdp *udp = backend->u.udp.data;\n SocketAddress *local_addr = socket_address_flatten(udp->local);\n@@ -214,6 +211,7 @@ static void upd_chr_open(Chardev *chr,\n g_free(name);\n \n s->ioc = QIO_CHANNEL(sioc);\n+ qemu_chr_be_event(chr, CHR_EVENT_OPENED);\n }\n \n static void char_udp_class_init(ObjectClass *oc, const void *data)\ndiff --git a/chardev/char-win-stdio.c b/chardev/char-win-stdio.c\nindex 866f3a20398..0535960ff1b 100644\n--- a/chardev/char-win-stdio.c\n+++ b/chardev/char-win-stdio.c\n@@ -144,7 +144,6 @@ static void win_stiod_chr_set_echo(Chardev *chr, bool echo)\n \n static void win_stdio_chr_open(Chardev *chr,\n ChardevBackend *backend,\n- bool *be_opened,\n Error **errp)\n {\n ChardevStdio *opts = backend->u.stdio.data;\n@@ -208,6 +207,7 @@ static void win_stdio_chr_open(Chardev *chr,\n \n win_stiod_chr_set_echo(chr, false);\n \n+ qemu_chr_be_event(chr, CHR_EVENT_OPENED);\n return;\n \n err3:\ndiff --git a/chardev/char.c b/chardev/char.c\nindex df37d1df161..44bfed36272 100644\n--- a/chardev/char.c\n+++ b/chardev/char.c\n@@ -246,8 +246,7 @@ int qemu_chr_add_client(Chardev *s, int fd)\n CHARDEV_GET_CLASS(s)->chr_add_client(s, fd) : -1;\n }\n \n-static void qemu_char_open(Chardev *chr, ChardevBackend *backend,\n- bool *be_opened, Error **errp)\n+static void qemu_char_open(Chardev *chr, ChardevBackend *backend, Error **errp)\n {\n ChardevClass *cc = CHARDEV_GET_CLASS(chr);\n /* Any ChardevCommon member would work */\n@@ -268,7 +267,7 @@ static void qemu_char_open(Chardev *chr, ChardevBackend *backend,\n }\n \n if (cc->chr_open) {\n- cc->chr_open(chr, backend, be_opened, errp);\n+ cc->chr_open(chr, backend, errp);\n }\n }\n \n@@ -1009,7 +1008,6 @@ static Chardev *chardev_new(const char *id, const char *typename,\n Object *obj;\n Chardev *chr = NULL;\n Error *local_err = NULL;\n- bool be_opened = true;\n \n assert(g_str_has_prefix(typename, \"chardev-\"));\n assert(id);\n@@ -1020,7 +1018,7 @@ static Chardev *chardev_new(const char *id, const char *typename,\n chr->label = g_strdup(id);\n chr->gcontext = gcontext;\n \n- qemu_char_open(chr, backend, &be_opened, &local_err);\n+ qemu_char_open(chr, backend, &local_err);\n if (local_err) {\n error_propagate(errp, local_err);\n object_unref(obj);\n@@ -1030,9 +1028,6 @@ static Chardev *chardev_new(const char *id, const char *typename,\n if (!chr->filename) {\n chr->filename = g_strdup(typename + 8);\n }\n- if (be_opened) {\n- qemu_chr_be_event(chr, CHR_EVENT_OPENED);\n- }\n \n return chr;\n }\ndiff --git a/chardev/msmouse.c b/chardev/msmouse.c\nindex d07cd998cb5..9dc04e3b3ec 100644\n--- a/chardev/msmouse.c\n+++ b/chardev/msmouse.c\n@@ -255,16 +255,16 @@ static void char_msmouse_finalize(Object *obj)\n \n static void msmouse_chr_open(Chardev *chr,\n ChardevBackend *backend,\n- bool *be_opened,\n Error **errp)\n {\n MouseChardev *mouse = MOUSE_CHARDEV(chr);\n \n- *be_opened = false;\n mouse->hs = qemu_input_handler_register((DeviceState *)mouse,\n &msmouse_handler);\n mouse->tiocm = 0;\n fifo8_create(&mouse->outbuf, MSMOUSE_BUF_SZ);\n+\n+ /* Never send CHR_EVENT_OPENED */\n }\n \n static void char_msmouse_class_init(ObjectClass *oc, const void *data)\ndiff --git a/chardev/spice.c b/chardev/spice.c\nindex 3ea25706653..f5b1f585eb1 100644\n--- a/chardev/spice.c\n+++ b/chardev/spice.c\n@@ -251,9 +251,7 @@ static void chr_open(Chardev *chr, const char *subtype)\n s->sin.subtype = g_strdup(subtype);\n }\n \n-static void spice_vmc_chr_open(Chardev *chr,\n- ChardevBackend *backend,\n- bool *be_opened,\n+static void spice_vmc_chr_open(Chardev *chr, ChardevBackend *backend,\n Error **errp)\n {\n ChardevSpiceChannel *spicevmc = backend->u.spicevmc.data;\n@@ -277,13 +275,10 @@ static void spice_vmc_chr_open(Chardev *chr,\n return;\n }\n \n- *be_opened = false;\n chr_open(chr, type);\n }\n \n-static void spice_port_chr_open(Chardev *chr,\n- ChardevBackend *backend,\n- bool *be_opened,\n+static void spice_port_chr_open(Chardev *chr, ChardevBackend *backend,\n Error **errp)\n {\n ChardevSpicePort *spiceport = backend->u.spiceport.data;\n@@ -302,7 +297,6 @@ static void spice_port_chr_open(Chardev *chr,\n \n chr_open(chr, \"port\");\n \n- *be_opened = false;\n s = SPICE_CHARDEV(chr);\n s->sin.portname = g_strdup(name);\n \ndiff --git a/chardev/wctablet.c b/chardev/wctablet.c\nindex 8285a56e7bc..65b2ceb58c9 100644\n--- a/chardev/wctablet.c\n+++ b/chardev/wctablet.c\n@@ -326,13 +326,10 @@ static void wctablet_chr_finalize(Object *obj)\n \n static void wctablet_chr_open(Chardev *chr,\n ChardevBackend *backend,\n- bool *be_opened,\n Error **errp)\n {\n TabletChardev *tablet = WCTABLET_CHARDEV(chr);\n \n- *be_opened = true;\n-\n /* init state machine */\n memcpy(tablet->outbuf, WC_FULL_CONFIG_STRING, WC_FULL_CONFIG_STRING_LENGTH);\n tablet->outlen = WC_FULL_CONFIG_STRING_LENGTH;\n@@ -340,6 +337,8 @@ static void wctablet_chr_open(Chardev *chr,\n \n tablet->hs = qemu_input_handler_register((DeviceState *)tablet,\n &wctablet_handler);\n+\n+ qemu_chr_be_event(chr, CHR_EVENT_OPENED);\n }\n \n static void wctablet_chr_class_init(ObjectClass *oc, const void *data)\ndiff --git a/gdbstub/system.c b/gdbstub/system.c\nindex e161b14485b..982857f314a 100644\n--- a/gdbstub/system.c\n+++ b/gdbstub/system.c\n@@ -233,10 +233,9 @@ static int gdb_chr_write(Chardev *chr, const uint8_t *buf, int len)\n return len;\n }\n \n-static void gdb_chr_open(Chardev *chr, ChardevBackend *backend,\n- bool *be_opened, Error **errp)\n+static void gdb_chr_open(Chardev *chr, ChardevBackend *backend, Error **errp)\n {\n- *be_opened = false;\n+ /* Never send CHR_EVENT_OPENED */\n }\n \n static void char_gdb_class_init(ObjectClass *oc, const void *data)\ndiff --git a/ui/console-vc.c b/ui/console-vc.c\nindex 931068d43ab..4c8ea4c1485 100644\n--- a/ui/console-vc.c\n+++ b/ui/console-vc.c\n@@ -1093,10 +1093,7 @@ void qemu_text_console_update_size(QemuTextConsole *c)\n dpy_text_resize(QEMU_CONSOLE(c), c->width, c->height);\n }\n \n-static void vc_chr_open(Chardev *chr,\n- ChardevBackend *backend,\n- bool *be_opened,\n- Error **errp)\n+static void vc_chr_open(Chardev *chr, ChardevBackend *backend, Error **errp)\n {\n ChardevVC *vc = backend->u.vc.data;\n VCChardev *drv = VC_CHARDEV(chr);\n@@ -1144,7 +1141,7 @@ static void vc_chr_open(Chardev *chr,\n drv->t_attrib = TEXT_ATTRIBUTES_DEFAULT;\n }\n \n- *be_opened = true;\n+ qemu_chr_be_event(chr, CHR_EVENT_OPENED);\n }\n \n static void vc_chr_parse(QemuOpts *opts, ChardevBackend *backend, Error **errp)\ndiff --git a/ui/dbus-chardev.c b/ui/dbus-chardev.c\nindex f6c426e2209..3e471f84cd8 100644\n--- a/ui/dbus-chardev.c\n+++ b/ui/dbus-chardev.c\n@@ -176,9 +176,7 @@ dbus_chr_send_break(\n return DBUS_METHOD_INVOCATION_HANDLED;\n }\n \n-static void\n-dbus_chr_open(Chardev *chr, ChardevBackend *backend,\n- bool *be_opened, Error **errp)\n+static void dbus_chr_open(Chardev *chr, ChardevBackend *backend, Error **errp)\n {\n ERRP_GUARD();\n \n@@ -211,7 +209,7 @@ dbus_chr_open(Chardev *chr, ChardevBackend *backend,\n return;\n }\n CHARDEV_CLASS(object_class_by_name(TYPE_CHARDEV_SOCKET))->chr_open(\n- chr, be, be_opened, errp);\n+ chr, be, errp);\n }\n \n static void\ndiff --git a/ui/gtk.c b/ui/gtk.c\nindex acf55cdfce2..44b2b868ec9 100644\n--- a/ui/gtk.c\n+++ b/ui/gtk.c\n@@ -1963,10 +1963,7 @@ static void gd_vc_chr_set_echo(Chardev *chr, bool echo)\n \n static int nb_vcs;\n static Chardev *vcs[MAX_VCS];\n-static void gd_vc_chr_open(Chardev *chr,\n- ChardevBackend *backend,\n- bool *be_opened,\n- Error **errp)\n+static void gd_vc_chr_open(Chardev *chr, ChardevBackend *backend, Error **errp)\n {\n if (nb_vcs == MAX_VCS) {\n error_setg(errp, \"Maximum number of consoles reached\");\n@@ -1975,10 +1972,10 @@ static void gd_vc_chr_open(Chardev *chr,\n \n vcs[nb_vcs++] = chr;\n \n- /* console/chardev init sometimes completes elsewhere in a 2nd\n+ /*\n+ * console/chardev init sometimes completes elsewhere in a 2nd\n * stage, so defer OPENED events until they are fully initialized\n */\n- *be_opened = false;\n }\n \n static void char_gd_vc_class_init(ObjectClass *oc, const void *data)\ndiff --git a/ui/spice-app.c b/ui/spice-app.c\nindex ea0b62a22b7..7ac9ae4e78d 100644\n--- a/ui/spice-app.c\n+++ b/ui/spice-app.c\n@@ -49,8 +49,7 @@ struct VCChardev {\n \n struct VCChardevClass {\n ChardevClass parent;\n- void (*parent_open)(Chardev *chr, ChardevBackend *backend,\n- bool *be_opened, Error **errp);\n+ void (*parent_open)(Chardev *chr, ChardevBackend *backend, Error **errp);\n };\n \n #define TYPE_CHARDEV_VC \"chardev-vc\"\n@@ -67,10 +66,7 @@ chr_spice_backend_new(void)\n return be;\n }\n \n-static void vc_chr_open(Chardev *chr,\n- ChardevBackend *backend,\n- bool *be_opened,\n- Error **errp)\n+static void vc_chr_open(Chardev *chr, ChardevBackend *backend, Error **errp)\n {\n VCChardevClass *vc = CHARDEV_VC_GET_CLASS(chr);\n ChardevBackend *be;\n@@ -87,7 +83,7 @@ static void vc_chr_open(Chardev *chr,\n be = chr_spice_backend_new();\n be->u.spiceport.data->fqdn = fqdn ?\n g_strdup(fqdn) : g_strdup_printf(\"org.qemu.console.%s\", chr->label);\n- vc->parent_open(chr, be, be_opened, errp);\n+ vc->parent_open(chr, be, errp);\n qapi_free_ChardevBackend(be);\n }\n \ndiff --git a/ui/vdagent.c b/ui/vdagent.c\nindex 090771ab171..644e9acaaeb 100644\n--- a/ui/vdagent.c\n+++ b/ui/vdagent.c\n@@ -662,7 +662,6 @@ static void vdagent_chr_recv_clipboard(VDAgentChardev *vd, VDAgentMessage *msg)\n \n static void vdagent_chr_open(Chardev *chr,\n ChardevBackend *backend,\n- bool *be_opened,\n Error **errp)\n {\n VDAgentChardev *vd = QEMU_VDAGENT_CHARDEV(chr);\n@@ -692,7 +691,7 @@ static void vdagent_chr_open(Chardev *chr,\n &vdagent_mouse_handler);\n }\n \n- *be_opened = true;\n+ qemu_chr_be_event(chr, CHR_EVENT_OPENED);\n }\n \n static void vdagent_clipboard_peer_register(VDAgentChardev *vd)\n", "prefixes": [ "PULL", "v2", "06/15" ] }