diff options
author | Alon Levy <alevy@redhat.com> | 2010-11-08 10:43:36 +0200 |
---|---|---|
committer | Alon Levy <alevy@redhat.com> | 2010-11-08 10:43:36 +0200 |
commit | 02ac147e09c85bad7da8683e1954cd97d6d19403 (patch) | |
tree | c5a3895f9b8339d175aa0b7917c83126ce3f8eb3 | |
parent | 118f1818205be15f2ab25370be41eb45b966c258 (diff) | |
download | spice-02ac147e09c85bad7da8683e1954cd97d6d19403.tar.gz spice-02ac147e09c85bad7da8683e1954cd97d6d19403.tar.xz spice-02ac147e09c85bad7da8683e1954cd97d6d19403.zip |
server/red_worker: introduce red_channel_pipe_clear, no more common_release_pipe_item
-rw-r--r-- | server/red_worker.c | 77 |
1 files changed, 18 insertions, 59 deletions
diff --git a/server/red_worker.c b/server/red_worker.c index f802577d..e52126fe 100644 --- a/server/red_worker.c +++ b/server/red_worker.c @@ -1371,69 +1371,17 @@ static void release_upgrade_item(RedWorker* worker, UpgradeItem *item) } } -static void common_release_pipe_item(RedChannel *channel, PipeItem *item) -{ - CommonChannel *common = SPICE_CONTAINEROF(channel, CommonChannel, base); - - switch (item->type) { - case PIPE_ITEM_TYPE_DRAW: - release_drawable(common->worker, SPICE_CONTAINEROF(item, Drawable, pipe_item)); - break; - case PIPE_ITEM_TYPE_CURSOR: - red_release_cursor(common->worker, (CursorItem *)item); - break; - case PIPE_ITEM_TYPE_UPGRADE: - release_upgrade_item(common->worker, (UpgradeItem *)item); - break; - case PIPE_ITEM_TYPE_PIXMAP_RESET: - case PIPE_ITEM_TYPE_PIXMAP_SYNC: - case PIPE_ITEM_TYPE_INVAL_ONE: - case PIPE_ITEM_TYPE_MIGRATE: - case PIPE_ITEM_TYPE_SET_ACK: - case PIPE_ITEM_TYPE_CURSOR_INIT: - case PIPE_ITEM_TYPE_VERB: - case PIPE_ITEM_TYPE_MIGRATE_DATA: - case PIPE_ITEM_TYPE_INVAL_PALLET_CACHE: - case PIPE_ITEM_TYPE_INVAL_CURSOR_CACHE: - free(item); - break; - case PIPE_ITEM_TYPE_IMAGE: - release_image_item((ImageItem *)item); - break; - case PIPE_ITEM_TYPE_STREAM_CREATE: - red_display_release_stream((DisplayChannel *)channel, - SPICE_CONTAINEROF(item, StreamAgent, create_item)); - break; - case PIPE_ITEM_TYPE_STREAM_CLIP: - red_display_release_stream_clip((DisplayChannel *)channel, (StreamClipItem*)item); - break; - case PIPE_ITEM_TYPE_STREAM_DESTROY: - red_display_release_stream((DisplayChannel *)channel, - SPICE_CONTAINEROF(item, StreamAgent, destroy_item)); - break; - case PIPE_ITEM_TYPE_CREATE_SURFACE: { - SurfaceCreateItem *surface_create = SPICE_CONTAINEROF(item, SurfaceCreateItem, - pipe_item); - free(surface_create); - break; - } - case PIPE_ITEM_TYPE_DESTROY_SURFACE: { - SurfaceDestroyItem *surface_destroy = SPICE_CONTAINEROF(item, SurfaceDestroyItem, - pipe_item); - free(surface_destroy); - break; - } - } -} - -static void red_pipe_clear(RedChannel *channel) +static void red_channel_pipe_clear(RedChannel *channel) { PipeItem *item; ASSERT(channel); + if (channel->send_data.item) { + channel->release_item(channel, channel->send_data.item, TRUE); + } while ((item = (PipeItem *)ring_get_head(&channel->pipe))) { ring_remove(&item->link); - common_release_pipe_item(channel, item); + channel->release_item(channel, item, FALSE); } channel->pipe_size = 0; } @@ -8572,7 +8520,7 @@ static inline int channel_is_connected(RedChannel *channel) static void red_disconnect_channel(RedChannel *channel) { channel_release_res(channel); - red_pipe_clear(channel); + red_channel_pipe_clear(channel); channel->peer->cb_free(channel->peer); @@ -9507,6 +9455,8 @@ static void display_channel_release_item(RedChannel *channel, PipeItem *item, in case PIPE_ITEM_TYPE_IMAGE: release_image_item((ImageItem *)item); break; + case PIPE_ITEM_TYPE_SET_ACK: + break; default: PANIC("invalid item type"); } @@ -9637,7 +9587,16 @@ static void cursor_channel_release_item(RedChannel *channel, PipeItem *item, int CommonChannel *common = SPICE_CONTAINEROF(channel, CommonChannel, base); ASSERT(item); - red_release_cursor(common->worker, SPICE_CONTAINEROF(item, CursorItem, pipe_data)); + switch (item->type) { + case PIPE_ITEM_TYPE_CURSOR: + red_release_cursor(common->worker, SPICE_CONTAINEROF(item, CursorItem, pipe_data)); + break; + case PIPE_ITEM_TYPE_SET_ACK: + free(item); + break; + default: + PANIC("invalid item type"); + } } static void red_connect_cursor(RedWorker *worker, RedsStreamContext *peer, int migrate) |