|
@@ -290,10 +290,10 @@ static void char_mux_finalize(Object *obj)
|
|
bit = -1;
|
|
bit = -1;
|
|
while ((bit = find_next_bit(&d->mux_bitset, MAX_MUX, bit + 1)) < MAX_MUX) {
|
|
while ((bit = find_next_bit(&d->mux_bitset, MAX_MUX, bit + 1)) < MAX_MUX) {
|
|
CharBackend *be = d->backends[bit];
|
|
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);
|
|
qemu_chr_fe_deinit(&d->chr, false);
|
|
}
|
|
}
|
|
|
|
|
|
@@ -332,6 +332,21 @@ bool mux_chr_attach_frontend(MuxChardev *d, CharBackend *b,
|
|
return true;
|
|
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)
|
|
void mux_set_focus(Chardev *chr, unsigned int focus)
|
|
{
|
|
{
|
|
MuxChardev *d = MUX_CHARDEV(chr);
|
|
MuxChardev *d = MUX_CHARDEV(chr);
|