From c90811bad5fbefb7faecba91e737b2a68189d4fd Mon Sep 17 00:00:00 2001
From: Izik Eidus <iei...@redhat.com>
Date: Tue, 5 Jan 2010 19:40:08 +0200
Subject: [PATCH] spice:stable server: add calls to 
red_pipe_clear_device_resources()

needed in case we are detaching

Signed-off-by: Izik Eidus <iei...@redhat.com>
---
 server/red_worker.c |   40 ++++++++++++++++++++++++++++++++++++++++
 1 files changed, 40 insertions(+), 0 deletions(-)

diff --git a/server/red_worker.c b/server/red_worker.c
index 1a0deb4..015f184 100644
--- a/server/red_worker.c
+++ b/server/red_worker.c
@@ -1233,6 +1233,40 @@ static void release_upgrade_item(RedWorker* worker, 
UpgradeItem *item)
     }
 }
 
+static void red_pipe_clear_device_resources(RedChannel *channel)
+{
+    Ring *ring;
+    PipeItem *item;
+
+    ASSERT(channel);
+    ring = &channel->pipe;
+    item = (PipeItem *) ring;
+    while ((item = (PipeItem *)ring_next(ring, (RingItem *)item))) {
+        PipeItem *tmp_item = item;
+
+        switch (item->type) {
+        case PIPE_ITEM_TYPE_DRAW:
+            item = (PipeItem *)ring_prev(ring, (RingItem *)item);
+            ring_remove(&tmp_item->link);
+            release_drawable(channel->worker, CONTAINEROF(tmp_item, Drawable, 
pipe_item));
+            channel->pipe_size--;
+            break;
+        case PIPE_ITEM_TYPE_CURSOR:
+            item = (PipeItem *)ring_prev(ring, (RingItem *)item);
+            ring_remove(&tmp_item->link);
+            red_release_cursor(channel->worker, (CursorItem *)tmp_item);
+            channel->pipe_size--;
+            break;
+        case PIPE_ITEM_TYPE_UPGRADE:
+            item = (PipeItem *)ring_prev(ring, (RingItem *)item);
+            ring_remove(&tmp_item->link);
+            release_upgrade_item(channel->worker, (UpgradeItem *)tmp_item);
+            channel->pipe_size--;
+            break;
+        }
+    }
+}
+
 static void red_pipe_clear(RedChannel *channel)
 {
     PipeItem *item;
@@ -8136,6 +8170,12 @@ static void handle_dev_input(EventListener *listener, 
uint32_t events)
         red_printf("detach");
         red_display_clear_glz_drawables(worker->display_channel);
         red_current_clear(worker);
+        if (worker->display_channel) {
+            red_pipe_clear_device_resources(&worker->display_channel->base);
+        }
+        if (worker->cursor_channel) {
+            red_pipe_clear_device_resources(&worker->cursor_channel->base);
+        }
 #ifdef STREAM_TRACE
         red_reset_stream_trace(worker);
 #endif
-- 
1.6.5.2

>From c90811bad5fbefb7faecba91e737b2a68189d4fd Mon Sep 17 00:00:00 2001
From: Izik Eidus <iei...@redhat.com>
Date: Tue, 5 Jan 2010 19:40:08 +0200
Subject: [PATCH] spice:stable server: add calls to red_pipe_clear_device_resources()

needed in case we are detaching

Signed-off-by: Izik Eidus <iei...@redhat.com>
---
 server/red_worker.c |   40 ++++++++++++++++++++++++++++++++++++++++
 1 files changed, 40 insertions(+), 0 deletions(-)

diff --git a/server/red_worker.c b/server/red_worker.c
index 1a0deb4..015f184 100644
--- a/server/red_worker.c
+++ b/server/red_worker.c
@@ -1233,6 +1233,40 @@ static void release_upgrade_item(RedWorker* worker, UpgradeItem *item)
     }
 }
 
+static void red_pipe_clear_device_resources(RedChannel *channel)
+{
+    Ring *ring;
+    PipeItem *item;
+
+    ASSERT(channel);
+    ring = &channel->pipe;
+    item = (PipeItem *) ring;
+    while ((item = (PipeItem *)ring_next(ring, (RingItem *)item))) {
+        PipeItem *tmp_item = item;
+
+        switch (item->type) {
+        case PIPE_ITEM_TYPE_DRAW:
+            item = (PipeItem *)ring_prev(ring, (RingItem *)item);
+            ring_remove(&tmp_item->link);
+            release_drawable(channel->worker, CONTAINEROF(tmp_item, Drawable, pipe_item));
+            channel->pipe_size--;
+            break;
+        case PIPE_ITEM_TYPE_CURSOR:
+            item = (PipeItem *)ring_prev(ring, (RingItem *)item);
+            ring_remove(&tmp_item->link);
+            red_release_cursor(channel->worker, (CursorItem *)tmp_item);
+            channel->pipe_size--;
+            break;
+        case PIPE_ITEM_TYPE_UPGRADE:
+            item = (PipeItem *)ring_prev(ring, (RingItem *)item);
+            ring_remove(&tmp_item->link);
+            release_upgrade_item(channel->worker, (UpgradeItem *)tmp_item);
+            channel->pipe_size--;
+            break;
+        }
+    }
+}
+
 static void red_pipe_clear(RedChannel *channel)
 {
     PipeItem *item;
@@ -8136,6 +8170,12 @@ static void handle_dev_input(EventListener *listener, uint32_t events)
         red_printf("detach");
         red_display_clear_glz_drawables(worker->display_channel);
         red_current_clear(worker);
+        if (worker->display_channel) {
+            red_pipe_clear_device_resources(&worker->display_channel->base);
+        }
+        if (worker->cursor_channel) {
+            red_pipe_clear_device_resources(&worker->cursor_channel->base);
+        }
 #ifdef STREAM_TRACE
         red_reset_stream_trace(worker);
 #endif
-- 
1.6.5.2

------------------------------------------------------------------------------
This SF.Net email is sponsored by the Verizon Developer Community
Take advantage of Verizon's best-in-class app development support
A streamlined, 14 day to market process makes app distribution fast and easy
Join now and get one step closer to millions of Verizon customers
http://p.sf.net/sfu/verizon-dev2dev 
_______________________________________________
Spice-space-devel mailing list
Spice-space-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/spice-space-devel

Reply via email to