[Spice-devel] [PATCH v2 6/6] Base FOREACH_DCC on GLIST_FOREACH

Frediano Ziglio fziglio at redhat.com
Tue Sep 20 08:05:04 UTC 2016


Signed-off-by: Frediano Ziglio <fziglio at redhat.com>
---
 server/display-channel.c | 42 +++++++++++++++++++++---------------------
 server/display-channel.h | 11 +++--------
 server/red-worker.c      |  4 ++--
 server/stream.c          | 24 ++++++++++++------------
 4 files changed, 38 insertions(+), 43 deletions(-)

diff --git a/server/display-channel.c b/server/display-channel.c
index 88a9ba3..8b949a2 100644
--- a/server/display-channel.c
+++ b/server/display-channel.c
@@ -174,7 +174,7 @@ void display_channel_surface_unref(DisplayChannel *display, uint32_t surface_id)
     RedSurface *surface = &display->priv->surfaces[surface_id];
     QXLInstance *qxl = display->common.qxl;
     DisplayChannelClient *dcc;
-    GList *link, *next;
+    GListIter iter;
 
     if (--surface->refs != 0) {
         return;
@@ -196,7 +196,7 @@ void display_channel_surface_unref(DisplayChannel *display, uint32_t surface_id)
 
     region_destroy(&surface->draw_dirty_region);
     surface->context.canvas = NULL;
-    FOREACH_DCC(display, link, next, dcc) {
+    FOREACH_DCC(display, iter, dcc) {
         dcc_destroy_surface(dcc, surface_id);
     }
 
@@ -214,7 +214,7 @@ static void streams_update_visible_region(DisplayChannel *display, Drawable *dra
 {
     Ring *ring;
     RingItem *item;
-    GList *link, *next;
+    GListIter iter;
     DisplayChannelClient *dcc;
 
     if (!red_channel_is_connected(RED_CHANNEL(display))) {
@@ -238,7 +238,7 @@ static void streams_update_visible_region(DisplayChannel *display, Drawable *dra
             continue;
         }
 
-        FOREACH_DCC(display, link, next, dcc) {
+        FOREACH_DCC(display, iter, dcc) {
             agent = dcc_get_stream_agent(dcc, display_channel_get_stream_id(display, stream));
 
             if (region_intersects(&agent->vis_region, &drawable->tree_item.base.rgn)) {
@@ -253,10 +253,10 @@ static void streams_update_visible_region(DisplayChannel *display, Drawable *dra
 static void pipes_add_drawable(DisplayChannel *display, Drawable *drawable)
 {
     DisplayChannelClient *dcc;
-    GList *link, *next;
+    GListIter iter;
 
     spice_warn_if_fail(drawable->pipes == NULL);
-    FOREACH_DCC(display, link, next, dcc) {
+    FOREACH_DCC(display, iter, dcc) {
         dcc_prepend_drawable(dcc, drawable);
     }
 }
@@ -281,9 +281,9 @@ static void pipes_add_drawable_after(DisplayChannel *display,
         return;
     }
     if (num_other_linked != g_list_length(display->common.base.clients)) {
-        GList *link, *next;
+        GListIter iter;
         spice_debug("TODO: not O(n^2)");
-        FOREACH_DCC(display, link, next, dcc) {
+        FOREACH_DCC(display, iter, dcc) {
             int sent = 0;
             GList *l;
             for (l = pos_after->pipes; l != NULL; l = l->next) {
@@ -434,7 +434,7 @@ static int current_add_equal(DisplayChannel *display, DrawItem *item, TreeItem *
 
             DisplayChannelClient *dcc;
             GList *dpi_item;
-            GList *link, *next;
+            GListIter iter;
 
             other_drawable->refs++;
             current_remove_drawable(display, other_drawable);
@@ -443,7 +443,7 @@ static int current_add_equal(DisplayChannel *display, DrawItem *item, TreeItem *
              * (or will receive) other_drawable */
             dpi_item = g_list_first(other_drawable->pipes);
             /* dpi contains a sublist of dcc's, ordered the same */
-            FOREACH_DCC(display, link, next, dcc) {
+            FOREACH_DCC(display, iter, dcc) {
                 if (dpi_item && dcc == ((RedDrawablePipeItem *) dpi_item->data)->dcc) {
                     dpi_item = dpi_item->next;
                 } else {
@@ -1163,24 +1163,24 @@ void display_channel_flush_all_surfaces(DisplayChannel *display)
 
 void display_channel_free_glz_drawables_to_free(DisplayChannel *display)
 {
-    GList *link, *next;
+    GListIter iter;
     DisplayChannelClient *dcc;
 
     spice_return_if_fail(display);
 
-    FOREACH_DCC(display, link, next, dcc) {
+    FOREACH_DCC(display, iter, dcc) {
         image_encoders_free_glz_drawables_to_free(dcc_get_encoders(dcc));
     }
 }
 
 void display_channel_free_glz_drawables(DisplayChannel *display)
 {
-    GList *link, *next;
+    GListIter iter;
     DisplayChannelClient *dcc;
 
     spice_return_if_fail(display);
 
-    FOREACH_DCC(display, link, next, dcc) {
+    FOREACH_DCC(display, iter, dcc) {
         image_encoders_free_glz_drawables(dcc_get_encoders(dcc));
     }
 }
@@ -1219,11 +1219,11 @@ void display_channel_free_some(DisplayChannel *display)
 {
     int n = 0;
     DisplayChannelClient *dcc;
-    GList *link, *next;
+    GListIter iter;
 
     spice_debug("#draw=%d, #glz_draw=%d", display->priv->drawable_count,
                 display->priv->encoder_shared_data.glz_drawable_count);
-    FOREACH_DCC(display, link, next, dcc) {
+    FOREACH_DCC(display, iter, dcc) {
         ImageEncoders *encoders = dcc_get_encoders(dcc);
 
         // encoding using the dictionary is prevented since the following operations might
@@ -1237,7 +1237,7 @@ void display_channel_free_some(DisplayChannel *display)
         free_one_drawable(display, TRUE);
     }
 
-    FOREACH_DCC(display, link, next, dcc) {
+    FOREACH_DCC(display, iter, dcc) {
         ImageEncoders *encoders = dcc_get_encoders(dcc);
 
         image_encoders_glz_encode_unlock(encoders);
@@ -1703,10 +1703,10 @@ void display_channel_update(DisplayChannel *display,
 static void clear_surface_drawables_from_pipes(DisplayChannel *display, int surface_id,
                                                int wait_if_used)
 {
-    GList *link, *next;
+    GListIter iter;
     DisplayChannelClient *dcc;
 
-    FOREACH_DCC(display, link, next, dcc) {
+    FOREACH_DCC(display, iter, dcc) {
         if (!dcc_clear_surface_drawables_from_pipe(dcc, surface_id, wait_if_used)) {
             red_channel_client_disconnect(RED_CHANNEL_CLIENT(dcc));
         }
@@ -1770,9 +1770,9 @@ void display_channel_destroy_surfaces(DisplayChannel *display)
 static void send_create_surface(DisplayChannel *display, int surface_id, int image_ready)
 {
     DisplayChannelClient *dcc;
-    GList *link, *next;
+    GListIter iter;
 
-    FOREACH_DCC(display, link, next, dcc) {
+    FOREACH_DCC(display, iter, dcc) {
         dcc_create_surface(dcc, surface_id);
         if (image_ready)
             dcc_push_surface_image(dcc, surface_id);
diff --git a/server/display-channel.h b/server/display-channel.h
index 20f299d..3da2b5f 100644
--- a/server/display-channel.h
+++ b/server/display-channel.h
@@ -214,14 +214,9 @@ struct DisplayChannel {
     DisplayChannelPrivate priv[1];
 };
 
-#define FOREACH_DCC(channel, _link, _next, _data)                   \
-    for (_link = (channel ? RED_CHANNEL(channel)->clients : NULL), \
-         _next = (_link ? _link->next : NULL), \
-         _data = (_link ? _link->data : NULL); \
-         _link; \
-         _link = _next, \
-         _next = (_link ? _link->next : NULL), \
-         _data = (_link ? _link->data : NULL))
+#define FOREACH_DCC(_channel, _iter, _data) \
+    GLIST_FOREACH((_channel ? RED_CHANNEL(_channel)->clients : NULL), \
+                  _iter, DisplayChannelClient, _data)
 
 int display_channel_get_stream_id(DisplayChannel *display, Stream *stream);
 
diff --git a/server/red-worker.c b/server/red-worker.c
index a79a075..27ab8a2 100644
--- a/server/red-worker.c
+++ b/server/red-worker.c
@@ -590,9 +590,9 @@ static void handle_dev_destroy_surfaces(void *opaque, void *payload)
 static void red_worker_push_monitors_config(RedWorker *worker)
 {
     DisplayChannelClient *dcc;
-    GList *item, *next;
+    GListIter iter;
 
-    FOREACH_DCC(worker->display_channel, item, next, dcc) {
+    FOREACH_DCC(worker->display_channel, iter, dcc) {
         dcc_push_monitors_config(dcc);
     }
 }
diff --git a/server/stream.c b/server/stream.c
index 4c6621c..9d878c8 100644
--- a/server/stream.c
+++ b/server/stream.c
@@ -96,13 +96,13 @@ static RedPipeItem *stream_destroy_item_new(StreamAgent *agent)
 void stream_stop(DisplayChannel *display, Stream *stream)
 {
     DisplayChannelClient *dcc;
-    GList *link, *next;
+    GListIter iter;
 
     spice_return_if_fail(ring_item_is_linked(&stream->link));
     spice_return_if_fail(!stream->current);
 
     spice_debug("stream %d", display_channel_get_stream_id(display, stream));
-    FOREACH_DCC(display, link, next, dcc) {
+    FOREACH_DCC(display, iter, dcc) {
         StreamAgent *stream_agent;
 
         stream_agent = dcc_get_stream_agent(dcc, display_channel_get_stream_id(display, stream));
@@ -279,7 +279,7 @@ static bool is_next_stream_frame(DisplayChannel *display,
 static void attach_stream(DisplayChannel *display, Drawable *drawable, Stream *stream)
 {
     DisplayChannelClient *dcc;
-    GList *link, *next;
+    GListIter iter;
 
     spice_assert(drawable && stream);
     spice_assert(!drawable->stream && !stream->current);
@@ -298,7 +298,7 @@ static void attach_stream(DisplayChannel *display, Drawable *drawable, Stream *s
         stream->num_input_frames++;
     }
 
-    FOREACH_DCC(display, link, next, dcc) {
+    FOREACH_DCC(display, iter, dcc) {
         StreamAgent *agent;
         QRegion clip_in_draw_dest;
 
@@ -335,7 +335,7 @@ static void before_reattach_stream(DisplayChannel *display,
     int index;
     StreamAgent *agent;
     GList *dpi_link, *dpi_next;
-    GList *link, *link_next;
+    GListIter iter;
 
     spice_return_if_fail(stream->current);
 
@@ -374,7 +374,7 @@ static void before_reattach_stream(DisplayChannel *display,
     }
 
 
-    FOREACH_DCC(display, link, link_next, dcc) {
+    FOREACH_DCC(display, iter, dcc) {
         double drop_factor;
 
         agent = dcc_get_stream_agent(dcc, index);
@@ -419,7 +419,7 @@ static Stream *display_channel_stream_try_new(DisplayChannel *display)
 static void display_channel_create_stream(DisplayChannel *display, Drawable *drawable)
 {
     DisplayChannelClient *dcc;
-    GList *link, *next;
+    GListIter iter;
     Stream *stream;
     SpiceRect* src_rect;
 
@@ -456,7 +456,7 @@ static void display_channel_create_stream(DisplayChannel *display, Drawable *dra
     stream->input_fps_start_time = drawable->creation_time;
     display->priv->streams_size_total += stream->width * stream->height;
     display->priv->stream_count++;
-    FOREACH_DCC(display, link, next, dcc) {
+    FOREACH_DCC(display, iter, dcc) {
         dcc_create_stream(dcc, stream);
     }
     spice_debug("stream %d %dx%d (%d, %d) (%d, %d) %u fps",
@@ -903,10 +903,10 @@ clear_vis_region:
 static void detach_stream_gracefully(DisplayChannel *display, Stream *stream,
                                      Drawable *update_area_limit)
 {
-    GList *link, *next;
+    GListIter iter;
     DisplayChannelClient *dcc;
 
-    FOREACH_DCC(display, link, next, dcc) {
+    FOREACH_DCC(display, iter, dcc) {
         dcc_detach_stream_gracefully(dcc, stream, update_area_limit);
     }
     if (stream->current) {
@@ -928,7 +928,7 @@ void stream_detach_behind(DisplayChannel *display, QRegion *region, Drawable *dr
 {
     Ring *ring = &display->priv->streams;
     RingItem *item = ring_get_head(ring);
-    GList *link, *next;
+    GListIter iter;
     DisplayChannelClient *dcc;
     bool is_connected = red_channel_is_connected(RED_CHANNEL(display));
 
@@ -937,7 +937,7 @@ void stream_detach_behind(DisplayChannel *display, QRegion *region, Drawable *dr
         int detach = 0;
         item = ring_next(ring, item);
 
-        FOREACH_DCC(display, link, next, dcc) {
+        FOREACH_DCC(display, iter, dcc) {
             StreamAgent *agent = dcc_get_stream_agent(dcc, display_channel_get_stream_id(display, stream));
 
             if (region_intersects(&agent->vis_region, region)) {
-- 
2.7.4



More information about the Spice-devel mailing list