[Spice-devel] [PATCH 07/20] StreamClipItem: use base class refcounting

Jonathon Jongsma jjongsma at redhat.com
Thu Apr 14 21:50:09 UTC 2016


PipeItem already implements refcounting. Use it.
---
 server/dcc.c             | 10 +++-------
 server/display-channel.c |  4 +---
 server/stream.c          | 30 +++++++++++++++---------------
 server/stream.h          |  6 +-----
 4 files changed, 20 insertions(+), 30 deletions(-)

diff --git a/server/dcc.c b/server/dcc.c
index fcef02d..9ada7f1 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 4d339f5..88dbc74 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 548c4c7..ae37a62 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 a3e84ed..c83e3b5 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;
-- 
2.4.11



More information about the Spice-devel mailing list