diff options
author | Izik Eidus <ieidus@redhat.com> | 2010-01-05 19:40:08 +0200 |
---|---|---|
committer | Yaniv Kamay <ykamay@redhat.com> | 2010-01-05 20:59:09 +0200 |
commit | 54a8e5027093baa1c847b43f2fb08bea93e0ed67 (patch) | |
tree | a560896c4d496357951908f75776a9dc4bc982a4 /server | |
parent | 68fa759dc468d23881b9b2521f644e4b4fb5f0c4 (diff) | |
download | spice-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>
Diffstat (limited to 'server')
-rw-r--r-- | 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 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 |