]> xenbits.xensource.com Git - libvirt.git/commitdiff
object_event: reference state only if virEventAddTimeout succeeded
authorXu Yandong <xuyandong2@huawei.com>
Thu, 19 Sep 2019 08:02:15 +0000 (04:02 -0400)
committerMichal Privoznik <mprivozn@redhat.com>
Thu, 19 Sep 2019 14:32:52 +0000 (16:32 +0200)
When registering new callback for an event, the event loop timer
must be created and registered. The timer has domain event state
object as an opaque argument which must be ref()-ed but only if
the timer was being created and registered successfully. We must
not ref it every time the virObjectEventStateRegisterID() runs.

Signed-off-by: Xu Yandong <xuyandong2@huawei.com>
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
Reviewed-by: Daniel Henrique Barboza <danielhb413@gmail.com>
src/conf/object_event.c

index 5d84598d5900de5c1d4d65089008694f283d25a6..a50a09e1a0d6a0cd0e0f3159e6fe298c1bf52074 100644 (file)
@@ -891,19 +891,20 @@ virObjectEventStateRegisterID(virConnectPtr conn,
     virObjectLock(state);
 
     if ((state->callbacks->count == 0) &&
-        (state->timer == -1) &&
-        (state->timer = virEventAddTimeout(-1,
-                                           virObjectEventTimer,
-                                           state,
-                                           virObjectFreeCallback)) < 0) {
-        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
-                       _("could not initialize domain event timer"));
-        goto cleanup;
-    }
+        (state->timer == -1)) {
+        if ((state->timer = virEventAddTimeout(-1,
+                                               virObjectEventTimer,
+                                               state,
+                                               virObjectFreeCallback)) < 0) {
+            virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+                           _("could not initialize domain event timer"));
+            goto cleanup;
+        }
 
-    /* event loop has one reference, but we need one more for the
-     * timer's opaque argument */
-    virObjectRef(state);
+        /* event loop has one reference, but we need one more for the
+         * timer's opaque argument */
+        virObjectRef(state);
+    }
 
     ret = virObjectEventCallbackListAddID(conn, state->callbacks,
                                           key, filter, filter_opaque,