diff options
author | Jonathon Jongsma <jjongsma@redhat.com> | 2016-04-14 15:32:20 -0500 |
---|---|---|
committer | Jonathon Jongsma <jjongsma@redhat.com> | 2016-04-15 09:59:10 -0500 |
commit | e09598ec75ff86c533050e9671cee836c2311c62 (patch) | |
tree | f4ef80bd99850ff1f4b446daa66510858d4026ba | |
parent | 889a0b880f359cefc1fe07ed9256a9463fc7a749 (diff) |
StreamClipItem: use base class refcounting
PipeItem already implements refcounting. Use it.
-rw-r--r-- | server/dcc.c | 10 | ||||
-rw-r--r-- | server/display-channel.c | 4 | ||||
-rw-r--r-- | server/stream.c | 30 | ||||
-rw-r--r-- | server/stream.h | 6 |
4 files changed, 20 insertions, 30 deletions
diff --git a/server/dcc.c b/server/dcc.c index 234246fb..daf31804 100644 --- a/server/dcc.c +++ b/server/dcc.c @@ -497,7 +497,7 @@ void dcc_stop(DisplayChannelClient *dcc) void dcc_stream_agent_clip(DisplayChannelClient* dcc, StreamAgent *agent) { - StreamClipItem *item = stream_clip_item_new(dcc, agent); + StreamClipItem *item = stream_clip_item_new(agent); int n_rects; item->clip_type = SPICE_CLIP_TYPE_RECTS; @@ -1601,10 +1601,8 @@ static void release_item_after_push(DisplayChannelClient *dcc, PipeItem *item) switch (item->type) { case PIPE_ITEM_TYPE_DRAW: case PIPE_ITEM_TYPE_IMAGE: - pipe_item_unref(item); - break; case PIPE_ITEM_TYPE_STREAM_CLIP: - stream_clip_item_unref(dcc, (StreamClipItem *)item); + pipe_item_unref(item); break; case PIPE_ITEM_TYPE_UPGRADE: upgrade_item_unref(display, (UpgradeItem *)item); @@ -1645,14 +1643,12 @@ static void release_item_before_push(DisplayChannelClient *dcc, PipeItem *item) stream_agent_unref(display, agent); break; } - case PIPE_ITEM_TYPE_STREAM_CLIP: - stream_clip_item_unref(dcc, (StreamClipItem *)item); - break; case PIPE_ITEM_TYPE_STREAM_DESTROY: { StreamAgent *agent = SPICE_CONTAINEROF(item, StreamAgent, destroy_item); stream_agent_unref(display, agent); break; } + case PIPE_ITEM_TYPE_STREAM_CLIP: case PIPE_ITEM_TYPE_UPGRADE: upgrade_item_unref(display, (UpgradeItem *)item); break; diff --git a/server/display-channel.c b/server/display-channel.c index 4d339f5b..88dbc74b 100644 --- a/server/display-channel.c +++ b/server/display-channel.c @@ -1972,10 +1972,8 @@ static void hold_item(RedChannelClient *rcc, PipeItem *item) switch (item->type) { case PIPE_ITEM_TYPE_DRAW: case PIPE_ITEM_TYPE_IMAGE: - pipe_item_ref(item); - break; case PIPE_ITEM_TYPE_STREAM_CLIP: - ((StreamClipItem *)item)->refs++; + pipe_item_ref(item); break; case PIPE_ITEM_TYPE_UPGRADE: ((UpgradeItem *)item)->refs++; diff --git a/server/stream.c b/server/stream.c index 548c4c7e..ae37a62d 100644 --- a/server/stream.c +++ b/server/stream.c @@ -133,29 +133,29 @@ void stream_agent_unref(DisplayChannel *display, StreamAgent *agent) stream_unref(display, agent->stream); } -StreamClipItem *stream_clip_item_new(DisplayChannelClient* dcc, StreamAgent *agent) +void stream_clip_item_free(StreamClipItem *item) { - StreamClipItem *item = spice_new(StreamClipItem, 1); - pipe_item_init((PipeItem *)item, PIPE_ITEM_TYPE_STREAM_CLIP); - - item->stream_agent = agent; - agent->stream->refs++; - item->refs = 1; - return item; -} - -void stream_clip_item_unref(DisplayChannelClient *dcc, StreamClipItem *item) -{ - DisplayChannel *display = DCC_TO_DC(dcc); + g_return_if_fail(item != NULL); + DisplayChannel *display = DCC_TO_DC(item->stream_agent->dcc); - if (--item->refs != 0) - return; + g_return_if_fail(item->base.refcount == 0); stream_agent_unref(display, item->stream_agent); free(item->rects); free(item); } +StreamClipItem *stream_clip_item_new(StreamAgent *agent) +{ + StreamClipItem *item = spice_new(StreamClipItem, 1); + pipe_item_init_full((PipeItem *)item, PIPE_ITEM_TYPE_STREAM_CLIP, + (GDestroyNotify)stream_clip_item_free); + + item->stream_agent = agent; + agent->stream->refs++; + return item; +} + static int is_stream_start(Drawable *drawable) { return ((drawable->frames_count >= RED_STREAM_FRAMES_START_CONDITION) && diff --git a/server/stream.h b/server/stream.h index a3e84edd..c83e3b5e 100644 --- a/server/stream.h +++ b/server/stream.h @@ -101,16 +101,12 @@ typedef struct StreamAgent { typedef struct StreamClipItem { PipeItem base; - int refs; StreamAgent *stream_agent; int clip_type; SpiceClipRects *rects; } StreamClipItem; -StreamClipItem * stream_clip_item_new (DisplayChannelClient* dcc, - StreamAgent *agent); -void stream_clip_item_unref (DisplayChannelClient *dcc, - StreamClipItem *item); +StreamClipItem * stream_clip_item_new (StreamAgent *agent); typedef struct ItemTrace { red_time_t time; |