[Spice-devel] [PATCH migration 17/19] client: display channel - destroy all surfaces on disconnect

Yonit Halperin yhalperi at redhat.com
Wed Oct 12 03:39:07 PDT 2011


Fix not destroying surfaces and other data (e.g., streams) upon disconnection.
(cherry picked from commit 010b22cd771b7e81363b4b6521e4265b093fcd25 branch 0.8)

Signed-off-by: Yonit Halperin <yhalperi at redhat.com>
---
 client/display_channel.cpp |   18 ++++++++++++------
 client/display_channel.h   |    1 +
 2 files changed, 13 insertions(+), 6 deletions(-)

diff --git a/client/display_channel.cpp b/client/display_channel.cpp
index f7fdbbc..2e0613c 100644
--- a/client/display_channel.cpp
+++ b/client/display_channel.cpp
@@ -1045,9 +1045,7 @@ void DisplayChannel::on_disconnect()
         _surfaces_cache[0]->clear();
     }
 
-    if (screen()) {
-        screen()->set_update_interrupt_trigger(NULL);
-    }
+    clear();
 
     AutoRef<DetachChannelsEvent> detach_channels(new DetachChannelsEvent(*this));
     get_client().push_event(*detach_channels);
@@ -1056,7 +1054,6 @@ void DisplayChannel::on_disconnect()
         get_client().push_event(*unlock_event);
         detach_from_screen(get_client().get_application());
     }
-    get_client().deactivate_interval_timer(*_streams_timer);
     AutoRef<SyncEvent> sync_event(new SyncEvent());
     get_client().push_event(*sync_event);
     (*sync_event)->wait();
@@ -1112,7 +1109,7 @@ void DisplayChannel::destroy_off_screen_surfaces()
     }
 }
 
-void DisplayChannel::on_disconnect_mig_src()
+void DisplayChannel::clear(bool destroy_primary)
 {
     _palette_cache.clear();
     destroy_streams();
@@ -1122,7 +1119,16 @@ void DisplayChannel::on_disconnect_mig_src()
     _update_mark = 0;
     _next_timer_time = 0;
     get_client().deactivate_interval_timer(*_streams_timer);
-    destroy_off_screen_surfaces();
+    if (destroy_primary) {
+        destroy_all_surfaces();
+    } else {
+        destroy_off_screen_surfaces();
+    }
+}
+
+void DisplayChannel::on_disconnect_mig_src()
+{
+    clear(false);
     // Not clrearing the primary surface till we receive a new one (or a timeout).
     if (_surfaces_cache.exist(0)) {
         AutoRef<MigPrimarySurfaceTimer> mig_timer(new MigPrimarySurfaceTimer());
diff --git a/client/display_channel.h b/client/display_channel.h
index 30a76e2..61109ed 100644
--- a/client/display_channel.h
+++ b/client/display_channel.h
@@ -179,6 +179,7 @@ private:
     void activate_streams_timer();
     void stream_update_request(uint32_t update_time);
     void reset_screen();
+    void clear(bool destroy_primary = true);
 
     static void set_clip_rects(const SpiceClip& clip, uint32_t& num_clip_rects, SpiceRect*& clip_rects);
 
-- 
1.7.6.4



More information about the Spice-devel mailing list