Message ID | 20241014114135.389766-8-r.peniaev@gmail.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | chardev/mux: implement frontend detach | expand |
Hi On Mon, Oct 14, 2024 at 3:46 PM Roman Penyaev <r.peniaev@gmail.com> wrote: > 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 > --- > chardev/char-fe.c | 2 +- > chardev/char-mux.c | 20 +++++++++++++++++--- > chardev/chardev-internal.h | 1 + > 3 files changed, 19 insertions(+), 4 deletions(-) > > diff --git a/chardev/char-fe.c b/chardev/char-fe.c > index 3b8771ca2ac4..8ac6bebb6f74 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 9c3cacb2fecd..649f8ff6ccbf 100644 > --- a/chardev/char-mux.c > +++ b/chardev/char-mux.c > @@ -289,10 +289,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); > } > > @@ -331,6 +331,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 >= MAX_MUX) { > if (bit != tag) instead? > + 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 b89aada5413b..853807f3cb88 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); > > -- > 2.34.1 > > >
On Mon, Oct 14, 2024 at 3:22 PM Marc-André Lureau <marcandre.lureau@gmail.com> wrote: [cut] >> >> +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 >= MAX_MUX) { > > > if (bit != tag) instead? Right, thanks. -- Roman
diff --git a/chardev/char-fe.c b/chardev/char-fe.c index 3b8771ca2ac4..8ac6bebb6f74 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 9c3cacb2fecd..649f8ff6ccbf 100644 --- a/chardev/char-mux.c +++ b/chardev/char-mux.c @@ -289,10 +289,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); } @@ -331,6 +331,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 >= MAX_MUX) { + 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 b89aada5413b..853807f3cb88 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);
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 --- chardev/char-fe.c | 2 +- chardev/char-mux.c | 20 +++++++++++++++++--- chardev/chardev-internal.h | 1 + 3 files changed, 19 insertions(+), 4 deletions(-)