提交 9ac3788b 编写于 作者: M Marc-André Lureau 提交者: Markus Armbruster

char: add a QEMU_CHAR_FEATURE_GCONTEXT flag

QEMU_CHAR_FEATURE_GCONTEXT declares the character device can switch
GMainContext.

Assert we don't switch context when the character device doesn't
provide this feature.  Character device users must not violate this
restriction.  In particular, user configurations that violate them
must be rejected.

Existing frontend that rely on context switching would now assert() if
the backend doesn't allow it (instead of silently producing undesired
events in the default context). Following patches improve the
situation by reporting an error earlier instead, on the frontend side.
Signed-off-by: NMarc-André Lureau <marcandre.lureau@redhat.com>
Message-Id: <20181205203737.9011-4-marcandre.lureau@redhat.com>
Signed-off-by: NMarkus Armbruster <armbru@redhat.com>
上级 ef12a703
...@@ -193,6 +193,8 @@ void qemu_chr_be_update_read_handlers(Chardev *s, ...@@ -193,6 +193,8 @@ void qemu_chr_be_update_read_handlers(Chardev *s,
{ {
ChardevClass *cc = CHARDEV_GET_CLASS(s); ChardevClass *cc = CHARDEV_GET_CLASS(s);
assert(qemu_chr_has_feature(s, QEMU_CHAR_FEATURE_GCONTEXT)
|| !context);
s->gcontext = context; s->gcontext = context;
if (cc->chr_update_read_handler) { if (cc->chr_update_read_handler) {
cc->chr_update_read_handler(s); cc->chr_update_read_handler(s);
...@@ -240,6 +242,15 @@ static void char_init(Object *obj) ...@@ -240,6 +242,15 @@ static void char_init(Object *obj)
chr->logfd = -1; chr->logfd = -1;
qemu_mutex_init(&chr->chr_write_lock); qemu_mutex_init(&chr->chr_write_lock);
/*
* Assume if chr_update_read_handler is implemented it will
* take the updated gcontext into account.
*/
if (CHARDEV_GET_CLASS(chr)->chr_update_read_handler) {
qemu_chr_set_feature(chr, QEMU_CHAR_FEATURE_GCONTEXT);
}
} }
static int null_chr_write(Chardev *chr, const uint8_t *buf, int len) static int null_chr_write(Chardev *chr, const uint8_t *buf, int len)
......
...@@ -47,6 +47,9 @@ typedef enum { ...@@ -47,6 +47,9 @@ typedef enum {
QEMU_CHAR_FEATURE_FD_PASS, QEMU_CHAR_FEATURE_FD_PASS,
/* Whether replay or record mode is enabled */ /* Whether replay or record mode is enabled */
QEMU_CHAR_FEATURE_REPLAY, QEMU_CHAR_FEATURE_REPLAY,
/* Whether the gcontext can be changed after calling
* qemu_chr_be_update_read_handlers() */
QEMU_CHAR_FEATURE_GCONTEXT,
QEMU_CHAR_FEATURE_LAST, QEMU_CHAR_FEATURE_LAST,
} ChardevFeature; } ChardevFeature;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册