[Spice-devel] [PATCH spice-server v3 4/4] spicevmc: Clear RedVmcChannel on red_char_device_spicevmc_dispose

Frediano Ziglio fziglio at redhat.com
Thu Nov 3 16:33:37 UTC 2016


This move object destructions from spicevmc_device_disconnect
to RedCharDeviceSpiceVmc destructor functions assuring any possible
RedCharDeviceSpiceVmc object free will clear its references.

Signed-off-by: Frediano Ziglio <fziglio at redhat.com>
---
 server/spicevmc.c | 28 +++++++++++++++-------------
 1 file changed, 15 insertions(+), 13 deletions(-)

diff --git a/server/spicevmc.c b/server/spicevmc.c
index b643787..d095378 100644
--- a/server/spicevmc.c
+++ b/server/spicevmc.c
@@ -879,19 +879,8 @@ RedCharDevice *spicevmc_device_connect(RedsState *reds,
 /* Must be called from RedClient handling thread. */
 void spicevmc_device_disconnect(RedsState *reds, SpiceCharDeviceInstance *sin)
 {
-    RedVmcChannel *channel;
-    RedCharDeviceSpiceVmc *vmc = RED_CHAR_DEVICE_SPICEVMC(sin->st);
-
-    channel = vmc->channel;
-    vmc->channel = NULL;
-
-    /* FIXME */
-    red_char_device_destroy(RED_CHAR_DEVICE(vmc));
-    channel->chardev = NULL;
+    g_object_unref(RED_CHAR_DEVICE(sin->st));
     sin->st = NULL;
-
-    reds_unregister_channel(reds, RED_CHANNEL(channel));
-    red_channel_destroy(RED_CHANNEL(channel));
 }
 
 SPICE_GNUC_VISIBLE void spice_server_port_event(SpiceCharDeviceInstance *sin, uint8_t event)
@@ -923,7 +912,20 @@ red_char_device_spicevmc_dispose(GObject *object)
 {
     RedCharDeviceSpiceVmc *self = RED_CHAR_DEVICE_SPICEVMC(object);
 
-    g_clear_object(&self->channel);
+    if (self->channel) {
+        RedChannel *channel = RED_CHANNEL(self->channel);
+        RedsState *reds = red_char_device_get_server(RED_CHAR_DEVICE(self));
+
+        // prevent possible recursive calls
+        self->channel->chardev = NULL;
+
+        // prevent future connection
+        reds_unregister_channel(reds, channel);
+
+        // close all current connections and drop the reference
+        red_channel_destroy(channel);
+        self->channel = NULL;
+    }
 }
 
 static void
-- 
2.7.4



More information about the Spice-devel mailing list