[Spice-commits] server/reds.c

Hans de Goede jwrdegoede at kemper.freedesktop.org
Tue Jul 26 05:13:23 PDT 2011


 server/reds.c |   65 +++++++++++++++++-----------------------------------------
 1 file changed, 20 insertions(+), 45 deletions(-)

New commits:
commit 37a24a888f308e03b5a62e4aba2a00e064cada95
Author: Hans de Goede <hdegoede at redhat.com>
Date:   Mon Jul 25 12:19:37 2011 +0200

    server: Don't call vdagent chardev state callback on client (dis)connect
    
    See this long mail for the rationale for this:
    http://lists.freedesktop.org/archives/spice-devel/2011-July/004837.html

diff --git a/server/reds.c b/server/reds.c
index e9694c0..7f45e46 100644
--- a/server/reds.c
+++ b/server/reds.c
@@ -153,7 +153,6 @@ struct SpiceCharDeviceState vdagent_char_device_state = {
 };
 
 typedef struct VDIPortState {
-    int connected;
     uint32_t plug_generation;
 
     uint32_t num_tokens;
@@ -557,6 +556,7 @@ static void reds_mig_cleanup()
 static void reds_reset_vdp()
 {
     VDIPortState *state = &reds->agent_state;
+    SpiceCharDeviceInterface *sif;
 
     while (!ring_is_empty(&state->write_queue)) {
         VDIPortBuf *buf;
@@ -581,6 +581,11 @@ static void reds_reset_vdp()
        messages written by the client */
     state->write_filter.result = AGENT_MSG_FILTER_DISCARD;
     state->write_filter.discard_all = TRUE;
+
+    sif = SPICE_CONTAINEROF(vdagent->base.sif, SpiceCharDeviceInterface, base);
+    if (sif->state) {
+        sif->state(vdagent, 0);
+    }
 }
 
 static int reds_main_channel_connected(void)
@@ -606,15 +611,6 @@ void reds_disconnect()
     reds->agent_state.read_filter.result = AGENT_MSG_FILTER_DISCARD;
     reds->agent_state.read_filter.discard_all = TRUE;
 
-    if (reds->agent_state.connected) {
-        SpiceCharDeviceInterface *sif;
-        sif = SPICE_CONTAINEROF(vdagent->base.sif, SpiceCharDeviceInterface, base);
-        reds->agent_state.connected = 0;
-        if (sif->state) {
-            sif->state(vdagent, reds->agent_state.connected);
-        }
-    }
-
     reds_shatdown_channels();
     reds->main_channel->shutdown(reds->main_channel);
     reds->main_channel = NULL;
@@ -711,31 +707,16 @@ static void reds_update_mouse_mode()
 
 static void reds_agent_remove()
 {
-    SpiceCharDeviceInstance *sin = vdagent;
-    SpiceCharDeviceInterface *sif;
-
     if (!reds->mig_target) {
         reds_reset_vdp();
     }
 
-    reds->agent_state.connected = 0;
     vdagent = NULL;
     reds_update_mouse_mode();
 
-    if (!reds_main_channel_connected() || !sin) {
-        return;
-    }
-
-    sif = SPICE_CONTAINEROF(sin->base.sif, SpiceCharDeviceInterface, base);
-    if (sif->state) {
-        sif->state(sin, reds->agent_state.connected);
-    }
-
-    if (reds->mig_target) {
-        return;
+    if (reds_main_channel_connected() && !reds->mig_target) {
+        main_channel_push_agent_disconnected(reds->main_channel);
     }
-
-    main_channel_push_agent_disconnected(reds->main_channel);
 }
 
 static void reds_push_tokens()
@@ -1105,7 +1086,7 @@ void reds_marshall_migrate_data_item(SpiceMarshaller *m, MainMigrateData *data)
 
     data->version = MAIN_CHANNEL_MIG_DATA_VERSION;
 
-    data->agent_connected = !!state->connected;
+    data->agent_connected = !!vdagent;
     data->client_agent_started = !state->write_filter.discard_all;
     data->num_client_tokens = state->num_client_tokens;
     data->send_tokens = ~0;
@@ -1324,13 +1305,13 @@ void reds_on_main_receive_migrate_data(MainMigrateData *data, uint8_t *end)
     state->num_tokens = REDS_AGENT_WINDOW_SIZE - state->num_client_tokens;
 
     if (!data->agent_connected) {
-        if (state->connected) {
+        if (vdagent) {
             main_channel_push_agent_connected(reds->main_channel);
         }
         return;
     }
 
-    if (!state->connected) {
+    if (!vdagent) {
         main_channel_push_agent_disconnected(reds->main_channel);
         return;
     }
@@ -1561,13 +1542,7 @@ static void reds_handle_main_link(RedLinkInfo *link)
     free(link_mess);
 
     if (vdagent) {
-        SpiceCharDeviceInterface *sif;
-        sif = SPICE_CONTAINEROF(vdagent->base.sif, SpiceCharDeviceInterface, base);
-        reds->agent_state.connected = 1;
         reds->agent_state.read_filter.discard_all = FALSE;
-        if (sif->state) {
-            sif->state(vdagent, reds->agent_state.connected);
-        }
         reds->agent_state.plug_generation++;
     }
 
@@ -3178,22 +3153,22 @@ static void attach_to_red_agent(SpiceCharDeviceInstance *sin)
 
     vdagent = sin;
     reds_update_mouse_mode();
-    if (!reds_main_channel_connected()) {
-        return;
-    }
+
     sif = SPICE_CONTAINEROF(vdagent->base.sif, SpiceCharDeviceInterface, base);
-    state->connected = 1;
-    state->read_filter.discard_all = FALSE;
     if (sif->state) {
-        sif->state(vdagent, state->connected);
+        sif->state(vdagent, 1);
     }
-    reds->agent_state.plug_generation++;
 
-    if (reds->mig_target) {
+    if (!reds_main_channel_connected()) {
         return;
     }
 
-    main_channel_push_agent_connected(reds->main_channel);
+    state->read_filter.discard_all = FALSE;
+    reds->agent_state.plug_generation++;
+
+    if (!reds->mig_target) {
+        main_channel_push_agent_connected(reds->main_channel);
+    }
 }
 
 SPICE_GNUC_VISIBLE void spice_server_char_device_wakeup(SpiceCharDeviceInstance* sin)


More information about the Spice-commits mailing list