summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIzik Eidus <ieidus@redhat.com>2010-01-05 19:40:08 +0200
committerYaniv Kamay <ykamay@redhat.com>2010-01-05 20:59:09 +0200
commit54a8e5027093baa1c847b43f2fb08bea93e0ed67 (patch)
treea560896c4d496357951908f75776a9dc4bc982a4
parent68fa759dc468d23881b9b2521f644e4b4fb5f0c4 (diff)
downloadspice-54a8e5027093baa1c847b43f2fb08bea93e0ed67.tar.gz
spice-54a8e5027093baa1c847b43f2fb08bea93e0ed67.tar.xz
spice-54a8e5027093baa1c847b43f2fb08bea93e0ed67.zip
spice:stable server: add calls to red_pipe_clear_device_resources()
needed in case we are detaching Signed-off-by: Izik Eidus <ieidus@redhat.com>
-rw-r--r--server/red_worker.c40
1 files changed, 40 insertions, 0 deletions
diff --git a/server/red_worker.c b/server/red_worker.c
index 1a0deb4f..015f1845 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