[libvirt PATCH v2 5/7] qemu: convert monitor to use the per-VM event loop

Michal Prívozník mprivozn at redhat.com
Fri Mar 6 13:42:52 UTC 2020


On 5. 3. 2020 13:51, Daniel P. Berrangé wrote:
> This converts the QEMU monitor APIs to use the per-VM
> event loop, which involves switching from virEvent APIs
> to GMainContext / GSource APIs.
> 
> A GSocket is used as a convenient way to create a GSource
> for a socket, but is not yet used for actual I/O.
> 
> Signed-off-by: Daniel P. Berrangé <berrange at redhat.com>
> ---
>  src/qemu/qemu_monitor.c      | 145 ++++++++++++++++-------------------
>  src/qemu/qemu_monitor.h      |   3 +-
>  src/qemu/qemu_process.c      |   6 +-
>  tests/qemumonitortestutils.c |   1 +
>  4 files changed, 71 insertions(+), 84 deletions(-)
> 


> @@ -831,25 +804,32 @@ qemuMonitorOpen(virDomainObjPtr vm,
>   *
>   * Registers the monitor in the event loop. The caller has to hold the
>   * lock for @mon.
> - *
> - * Returns true in case of success, false otherwise
>   */
> -bool
> +void
>  qemuMonitorRegister(qemuMonitorPtr mon)
>  {
> -    virObjectRef(mon);
> -    if ((mon->watch = virEventAddHandle(mon->fd,
> -                                        VIR_EVENT_HANDLE_HANGUP |
> -                                        VIR_EVENT_HANDLE_ERROR |
> -                                        VIR_EVENT_HANDLE_READABLE,
> -                                        qemuMonitorIO,
> -                                        mon,
> -                                        virObjectFreeCallback)) < 0) {
> -        virObjectUnref(mon);
> -        return false;
> +    GIOCondition cond = 0;
> +
> +    if (mon->lastError.code == VIR_ERR_OK) {
> +        cond |= G_IO_IN;
> +
> +        if ((mon->msg && mon->msg->txOffset < mon->msg->txLength) &&
> +            !mon->waitGreeting)
> +            cond |= G_IO_OUT;
>      }
>  
> -    return true;
> +    mon->watch = g_socket_create_source(mon->socket,
> +                                        cond,
> +                                        NULL);
> +
> +    virObjectRef(mon);
> +    g_source_set_callback(mon->watch,
> +                          (GSourceFunc)qemuMonitorIO,
> +                          mon,
> +                          NULL);

So previously, we passed virObjectFreeCallback, so that @mon is unrefed
when removing the watch. But now you're passing NULL which will lead to
a memleak. Replace it with "(GDestroyNotify) virObjectUnref".

Michal




More information about the libvir-list mailing list