diff options
author | Roman Penyaev <r.peniaev@gmail.com> | 2024-10-14 17:24:07 +0200 |
---|---|---|
committer | Marc-André Lureau <marcandre.lureau@redhat.com> | 2024-10-15 12:26:01 +0400 |
commit | 327993f180e22f7f18b8693bd2381b74b1f971a6 (patch) | |
tree | d9a67d37156a9bcdec3d2f4f0895b64e82608d42 /chardev | |
parent | 005b6d511f23e0c2b69b4c7353defaa48c24853d (diff) | |
download | qemu-327993f180e22f7f18b8693bd2381b74b1f971a6.zip qemu-327993f180e22f7f18b8693bd2381b74b1f971a6.tar.gz qemu-327993f180e22f7f18b8693bd2381b74b1f971a6.tar.bz2 |
chardev/mux: implement detach of frontends from mux
With bitset management now it becomes feasible to implement
the logic of detaching frontends from multiplexer.
Signed-off-by: Roman Penyaev <r.peniaev@gmail.com>
Cc: "Marc-André Lureau" <marcandre.lureau@redhat.com>
Cc: qemu-devel@nongnu.org
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Message-ID: <20241014152408.427700-8-r.peniaev@gmail.com>
Diffstat (limited to 'chardev')
-rw-r--r-- | chardev/char-fe.c | 2 | ||||
-rw-r--r-- | chardev/char-mux.c | 21 | ||||
-rw-r--r-- | chardev/chardev-internal.h | 1 |
3 files changed, 20 insertions, 4 deletions
diff --git a/chardev/char-fe.c b/chardev/char-fe.c index 3b8771c..8ac6beb 100644 --- a/chardev/char-fe.c +++ b/chardev/char-fe.c @@ -225,7 +225,7 @@ void qemu_chr_fe_deinit(CharBackend *b, bool del) } if (CHARDEV_IS_MUX(b->chr)) { MuxChardev *d = MUX_CHARDEV(b->chr); - d->backends[b->tag] = NULL; + mux_chr_detach_frontend(d, b->tag); } if (del) { Object *obj = OBJECT(b->chr); diff --git a/chardev/char-mux.c b/chardev/char-mux.c index 4fc619b..bda5c45 100644 --- a/chardev/char-mux.c +++ b/chardev/char-mux.c @@ -290,10 +290,10 @@ static void char_mux_finalize(Object *obj) bit = -1; while ((bit = find_next_bit(&d->mux_bitset, MAX_MUX, bit + 1)) < MAX_MUX) { CharBackend *be = d->backends[bit]; - if (be) { - be->chr = NULL; - } + be->chr = NULL; + d->backends[bit] = NULL; } + d->mux_bitset = 0; qemu_chr_fe_deinit(&d->chr, false); } @@ -332,6 +332,21 @@ bool mux_chr_attach_frontend(MuxChardev *d, CharBackend *b, return true; } +bool mux_chr_detach_frontend(MuxChardev *d, unsigned int tag) +{ + unsigned int bit; + + bit = find_next_bit(&d->mux_bitset, MAX_MUX, tag); + if (bit != tag) { + return false; + } + + d->mux_bitset &= ~(1 << bit); + d->backends[bit] = NULL; + + return true; +} + void mux_set_focus(Chardev *chr, unsigned int focus) { MuxChardev *d = MUX_CHARDEV(chr); diff --git a/chardev/chardev-internal.h b/chardev/chardev-internal.h index b89aada..853807f 100644 --- a/chardev/chardev-internal.h +++ b/chardev/chardev-internal.h @@ -61,6 +61,7 @@ DECLARE_INSTANCE_CHECKER(MuxChardev, MUX_CHARDEV, bool mux_chr_attach_frontend(MuxChardev *d, CharBackend *b, unsigned int *tag, Error **errp); +bool mux_chr_detach_frontend(MuxChardev *d, unsigned int tag); void mux_set_focus(Chardev *chr, unsigned int focus); void mux_chr_send_all_event(Chardev *chr, QEMUChrEvent event); |