summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathon Jongsma <jjongsma@redhat.com>2016-04-14 15:32:20 -0500
committerJonathon Jongsma <jjongsma@redhat.com>2016-04-15 09:59:10 -0500
commite09598ec75ff86c533050e9671cee836c2311c62 (patch)
treef4ef80bd99850ff1f4b446daa66510858d4026ba
parent889a0b880f359cefc1fe07ed9256a9463fc7a749 (diff)
StreamClipItem: use base class refcounting
PipeItem already implements refcounting. Use it.
-rw-r--r--server/dcc.c10
-rw-r--r--server/display-channel.c4
-rw-r--r--server/stream.c30
-rw-r--r--server/stream.h6
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;