Commit 1ce2610c authored by Marc-André Lureau's avatar Marc-André Lureau
Browse files

char: make chr_fe_deinit() optionaly delete backend



This simplifies removing a backend for a frontend user (no need to
retrieve the associated driver and separate delete call etc).

NB: many frontends have questionable handling of ending a chardev. They
should probably delete the backend to prevent broken reusage.

Signed-off-by: default avatarMarc-André Lureau <marcandre.lureau@redhat.com>
Reviewed-by: default avatarPhilippe Mathieu-Daudé <f4bug@amsat.org>
parent a9b1ca38
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -145,7 +145,7 @@ static void rng_egd_finalize(Object *obj)
{
    RngEgd *s = RNG_EGD(obj);

    qemu_chr_fe_deinit(&s->chr);
    qemu_chr_fe_deinit(&s->chr, false);
    g_free(s->chr_name);
}

+4 −1
Original line number Diff line number Diff line
@@ -211,7 +211,7 @@ unavailable:
    return false;
}

void qemu_chr_fe_deinit(CharBackend *b)
void qemu_chr_fe_deinit(CharBackend *b, bool del)
{
    assert(b);

@@ -224,6 +224,9 @@ void qemu_chr_fe_deinit(CharBackend *b)
            MuxChardev *d = MUX_CHARDEV(b->chr);
            d->backends[b->tag] = NULL;
        }
        if (del) {
            object_unparent(OBJECT(b->chr));
        }
        b->chr = NULL;
    }
}
+1 −1
Original line number Diff line number Diff line
@@ -266,7 +266,7 @@ static void char_mux_finalize(Object *obj)
            be->chr = NULL;
        }
    }
    qemu_chr_fe_deinit(&d->chr);
    qemu_chr_fe_deinit(&d->chr, false);
}

void mux_chr_set_handlers(Chardev *chr, GMainContext *context)
+2 −13
Original line number Diff line number Diff line
@@ -1678,9 +1678,6 @@ void gdb_exit(CPUArchState *env, int code)
{
  GDBState *s;
  char buf[4];
#ifndef CONFIG_USER_ONLY
  Chardev *chr;
#endif

  s = gdbserver_state;
  if (!s) {
@@ -1690,19 +1687,13 @@ void gdb_exit(CPUArchState *env, int code)
  if (gdbserver_fd < 0 || s->fd < 0) {
      return;
  }
#else
  chr = qemu_chr_fe_get_driver(&s->chr);
  if (!chr) {
      return;
  }
#endif

  snprintf(buf, sizeof(buf), "W%02x", (uint8_t)code);
  put_packet(s, buf);

#ifndef CONFIG_USER_ONLY
  qemu_chr_fe_deinit(&s->chr);
  object_unparent(OBJECT(chr));
  qemu_chr_fe_deinit(&s->chr, true);
#endif
}

@@ -2002,9 +1993,7 @@ int gdbserver_start(const char *device)
                                   NULL, &error_abort);
        monitor_init(mon_chr, 0);
    } else {
        if (qemu_chr_fe_get_driver(&s->chr)) {
            object_unparent(OBJECT(qemu_chr_fe_get_driver(&s->chr)));
        }
        qemu_chr_fe_deinit(&s->chr, true);
        mon_chr = s->mon_chr;
        memset(s, 0, sizeof(GDBState));
        s->mon_chr = mon_chr;
+1 −1
Original line number Diff line number Diff line
@@ -905,7 +905,7 @@ void serial_realize_core(SerialState *s, Error **errp)

void serial_exit_core(SerialState *s)
{
    qemu_chr_fe_deinit(&s->chr);
    qemu_chr_fe_deinit(&s->chr, false);

    timer_del(s->modem_status_poll);
    timer_free(s->modem_status_poll);
Loading