StreamClipItem: use base class refcounting

PipeItem already implements refcounting. Use it.
This commit is contained in:
Jonathon Jongsma 2016-04-14 15:32:20 -05:00
parent 889a0b880f
commit e09598ec75
4 changed files with 20 additions and 30 deletions

View File

@ -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;

View File

@ -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++;

View File

@ -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);
g_return_if_fail(item != NULL);
DisplayChannel *display = DCC_TO_DC(item->stream_agent->dcc);
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);
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) &&

View File

@ -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;