[Spice-devel] [PATCH spice-gtk] spice-session: Remove last usage of ring_ functions

Frediano Ziglio fziglio at redhat.com
Wed Sep 26 11:47:12 UTC 2018


Not much sense to reimplement a list using Ring type.
This patch maintains the stability of the iterators and
the order of the items in the container.

Signed-off-by: Frediano Ziglio <fziglio at redhat.com>
---
 src/spice-session.c | 135 +++++++++++++++-----------------------------
 1 file changed, 46 insertions(+), 89 deletions(-)

diff --git a/src/spice-session.c b/src/spice-session.c
index fd1856d..d422f5a 100644
--- a/src/spice-session.c
+++ b/src/spice-session.c
@@ -34,11 +34,6 @@
 #include "channel-playback-priv.h"
 #include "spice-audio-priv.h"
 
-struct channel {
-    SpiceChannel      *channel;
-    RingItem          link;
-};
-
 #define IMAGES_CACHE_SIZE_DEFAULT (1024 * 1024 * 80)
 #define MIN_GLZ_WINDOW_SIZE_DEFAULT (1024 * 1024 * 12)
 #define MAX_GLZ_WINDOW_SIZE_DEFAULT MIN((LZ_MAX_WINDOW_SIZE * 4), 1024 * 1024 * 64)
@@ -93,7 +88,7 @@ struct _SpiceSessionPrivate {
     int               connection_id;
     int               protocol;
     SpiceChannel      *cmain; /* weak reference */
-    Ring              channels;
+    GList             *channels;
     guint             channels_destroying;
     gboolean          client_provided_sockets;
     guint64           mm_time_offset;
@@ -283,7 +278,7 @@ static void spice_session_init(SpiceSession *session)
     SPICE_DEBUG("Supported channels: %s", channels);
     g_free(channels);
 
-    ring_init(&s->channels);
+    s->channels = NULL;
     s->images = cache_image_new((GDestroyNotify)pixman_image_unref);
     s->glz_window = glz_decoder_window_new();
     update_proxy(session, NULL);
@@ -293,19 +288,17 @@ static void
 session_disconnect(SpiceSession *self, gboolean keep_main)
 {
     SpiceSessionPrivate *s;
-    struct channel *item;
-    RingItem *ring, *next;
 
     s = self->priv;
 
-    for (ring = ring_get_head(&s->channels); ring != NULL; ring = next) {
-        next = ring_next(&s->channels, ring);
-        item = SPICE_CONTAINEROF(ring, struct channel, link);
+    for (GList *l = s->channels; l != NULL; ) {
+        SpiceChannel *channel = l->data;
+        l = l->next;
 
-        if (keep_main && item->channel == s->cmain) {
-            spice_channel_disconnect(item->channel, SPICE_CHANNEL_NONE);
+        if (keep_main && channel == s->cmain) {
+            spice_channel_disconnect(channel, SPICE_CHANNEL_NONE);
         } else {
-            spice_session_channel_destroy(self, item->channel);
+            spice_session_channel_destroy(self, channel);
         }
     }
 
@@ -332,7 +325,7 @@ spice_session_dispose(GObject *gobject)
     g_warn_if_fail(s->after_main_init == 0);
     g_warn_if_fail(s->disconnecting == 0);
     g_warn_if_fail(s->channels_destroying == 0);
-    g_warn_if_fail(ring_is_empty(&s->channels));
+    g_warn_if_fail(s->channels == NULL);
 
     g_clear_object(&s->audio_manager);
     g_clear_object(&s->usb_manager);
@@ -1662,23 +1655,21 @@ void spice_session_switching_disconnect(SpiceSession *self)
     g_return_if_fail(SPICE_IS_SESSION(self));
 
     SpiceSessionPrivate *s = self->priv;
-    struct channel *item;
-    RingItem *ring, *next;
 
     g_return_if_fail(s->cmain != NULL);
 
     /* disconnect/destroy all but main channel */
 
-    for (ring = ring_get_head(&s->channels); ring != NULL; ring = next) {
-        next = ring_next(&s->channels, ring);
-        item = SPICE_CONTAINEROF(ring, struct channel, link);
+    for (GList *l = s->channels; l != NULL; ) {
+        SpiceChannel *channel = l->data;
+        l = l->next;
 
-        if (item->channel == s->cmain)
+        if (channel == s->cmain)
             continue;
-        spice_session_channel_destroy(self, item->channel);
+        spice_session_channel_destroy(self, channel);
     }
 
-    g_warn_if_fail(!ring_is_empty(&s->channels)); /* ring_get_length() == 1 */
+    g_warn_if_fail(s->channels != NULL);
 
     cache_clear_all(self);
     s->connection_id = 0;
@@ -1716,10 +1707,10 @@ void spice_session_start_migrating(SpiceSession *session,
     SWAP_STR(s->tls_port, m->tls_port);
     SWAP_STR(s->unix_path, m->unix_path);
 
-    g_warn_if_fail(ring_get_length(&s->channels) == ring_get_length(&m->channels));
+    g_warn_if_fail(g_list_length(s->channels) == g_list_length(m->channels));
 
     SPICE_DEBUG("migration channels left:%u (in migration:%u)",
-                ring_get_length(&s->channels), ring_get_length(&m->channels));
+                g_list_length(s->channels), g_list_length(m->channels));
     s->migration_left = spice_session_get_channels(session);
 }
 #undef SWAP_STR
@@ -1729,26 +1720,21 @@ SpiceChannel* spice_session_lookup_channel(SpiceSession *session, gint id, gint
 {
     g_return_val_if_fail(SPICE_IS_SESSION(session), NULL);
 
-    RingItem *ring, *next;
     SpiceSessionPrivate *s = session->priv;
-    struct channel *c;
-
-    for (ring = ring_get_head(&s->channels);
-         ring != NULL; ring = next) {
-        next = ring_next(&s->channels, ring);
-        c = SPICE_CONTAINEROF(ring, struct channel, link);
-        if (c == NULL || c->channel == NULL) {
-            g_warn_if_reached();
-            continue;
-        }
+    SpiceChannel *channel = NULL;
+
+    for (GList *l = s->channels; l != NULL; ) {
+        channel = l->data;
+        l = l->next;
 
-        if (id == spice_channel_get_channel_id(c->channel) &&
-            type == spice_channel_get_channel_type(c->channel))
+        if (id == spice_channel_get_channel_id(channel) &&
+            type == spice_channel_get_channel_type(channel)) {
             break;
+        }
     }
-    g_return_val_if_fail(ring != NULL, NULL);
+    g_return_val_if_fail(channel != NULL, NULL);
 
-    return c->channel;
+    return channel;
 }
 
 G_GNUC_INTERNAL
@@ -1757,8 +1743,6 @@ void spice_session_abort_migration(SpiceSession *session)
     g_return_if_fail(SPICE_IS_SESSION(session));
 
     SpiceSessionPrivate *s = session->priv;
-    RingItem *ring, *next;
-    struct channel *c;
 
     if (s->migration == NULL) {
         SPICE_DEBUG("no migration in progress");
@@ -1769,18 +1753,17 @@ void spice_session_abort_migration(SpiceSession *session)
     if (s->migration_state != SPICE_SESSION_MIGRATION_MIGRATING)
         goto end;
 
-    for (ring = ring_get_head(&s->channels);
-         ring != NULL; ring = next) {
-        next = ring_next(&s->channels, ring);
-        c = SPICE_CONTAINEROF(ring, struct channel, link);
+    for (GList *l = s->channels; l != NULL; ) {
+        SpiceChannel *channel = l->data;
+        l = l->next;
 
-        if (g_list_find(s->migration_left, c->channel))
+        if (g_list_find(s->migration_left, channel))
             continue;
 
-        spice_channel_swap(c->channel,
+        spice_channel_swap(channel,
             spice_session_lookup_channel(s->migration,
-                                         spice_channel_get_channel_id(c->channel),
-                                         spice_channel_get_channel_type(c->channel)),
+                                         spice_channel_get_channel_id(channel),
+                                         spice_channel_get_channel_type(channel)),
                                          !s->full_migration);
     }
 
@@ -1879,14 +1862,13 @@ void spice_session_migrate_end(SpiceSession *self)
 
     SpiceSessionPrivate *s = self->priv;
     SpiceMsgOut *out;
-    GList *l;
 
     g_return_if_fail(s->migration);
     g_return_if_fail(s->migration->priv->cmain);
     g_return_if_fail(g_list_length(s->migration_left) != 0);
 
     /* disconnect and reset all channels */
-    for (l = s->migration_left; l != NULL; ) {
+    for (GList *l = s->migration_left; l != NULL; ) {
         SpiceChannel *channel = l->data;
         l = l->next;
 
@@ -1974,23 +1956,10 @@ void spice_session_disconnect(SpiceSession *session)
  **/
 GList *spice_session_get_channels(SpiceSession *session)
 {
-    SpiceSessionPrivate *s;
-    struct channel *item;
-    GList *list = NULL;
-    RingItem *ring;
-
     g_return_val_if_fail(SPICE_IS_SESSION(session), NULL);
     g_return_val_if_fail(session->priv != NULL, NULL);
 
-    s = session->priv;
-
-    for (ring = ring_get_head(&s->channels);
-         ring != NULL;
-         ring = ring_next(&s->channels, ring)) {
-        item = SPICE_CONTAINEROF(ring, struct channel, link);
-        list = g_list_append(list, item->channel);
-    }
-    return list;
+    return g_list_copy(session->priv->channels);
 }
 
 /**
@@ -2006,19 +1975,15 @@ GList *spice_session_get_channels(SpiceSession *session)
 gboolean spice_session_has_channel_type(SpiceSession *session, gint type)
 {
     SpiceSessionPrivate *s;
-    struct channel *item;
-    RingItem *ring;
 
     g_return_val_if_fail(SPICE_IS_SESSION(session), FALSE);
     g_return_val_if_fail(session->priv != NULL, FALSE);
 
     s = session->priv;
 
-    for (ring = ring_get_head(&s->channels);
-         ring != NULL;
-         ring = ring_next(&s->channels, ring)) {
-        item = SPICE_CONTAINEROF(ring, struct channel, link);
-        if (spice_channel_get_channel_type(item->channel) == type) {
+    for (GList *l = s->channels; l != NULL; l = l->next) {
+        SpiceChannel *channel = l->data;
+        if (spice_channel_get_channel_type(channel) == type) {
             return TRUE;
         }
     }
@@ -2246,12 +2211,8 @@ void spice_session_channel_new(SpiceSession *session, SpiceChannel *channel)
     g_return_if_fail(SPICE_IS_CHANNEL(channel));
 
     SpiceSessionPrivate *s = session->priv;
-    struct channel *item;
 
-
-    item = g_new0(struct channel, 1);
-    item->channel = channel;
-    ring_add(&s->channels, &item->link);
+    s->channels = g_list_prepend(s->channels, channel);
 
     if (SPICE_IS_MAIN_CHANNEL(channel)) {
         gboolean all = spice_strv_contains(s->disable_effects, "all");
@@ -2279,7 +2240,7 @@ static void channel_finally_destroyed(gpointer data, GObject *channel)
     SpiceSession *session = SPICE_SESSION(data);
     SpiceSessionPrivate *s = session->priv;
     s->channels_destroying--;
-    if (ring_is_empty(&s->channels) && (s->channels_destroying == 0)) {
+    if (s->channels == NULL && (s->channels_destroying == 0)) {
         g_signal_emit(session, signals[SPICE_SESSION_DISCONNECTED], 0);
     }
     g_object_unref(session);
@@ -2291,28 +2252,24 @@ static void spice_session_channel_destroy(SpiceSession *session, SpiceChannel *c
     g_return_if_fail(SPICE_IS_CHANNEL(channel));
 
     SpiceSessionPrivate *s = session->priv;
-    struct channel *item = NULL;
-    RingItem *ring;
+    GList *l;
 
     if (s->migration_left)
         s->migration_left = g_list_remove(s->migration_left, channel);
 
-    for (ring = ring_get_head(&s->channels); ring != NULL;
-         ring = ring_next(&s->channels, ring)) {
-        item = SPICE_CONTAINEROF(ring, struct channel, link);
-        if (item->channel == channel)
+    for (l = s->channels; l != NULL; l = l->next) {
+        if (l->data == channel)
             break;
     }
 
-    g_return_if_fail(ring != NULL);
+    g_return_if_fail(l != NULL);
 
     if (channel == s->cmain) {
         CHANNEL_DEBUG(channel, "the session lost the main channel");
         s->cmain = NULL;
     }
 
-    ring_remove(&item->link);
-    g_free(item);
+    s->channels = g_list_delete_link(s->channels, l);
 
     g_signal_emit(session, signals[SPICE_SESSION_CHANNEL_DESTROY], 0, channel);
 
-- 
2.17.1



More information about the Spice-devel mailing list