[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