summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2017-05-06 21:14:30 +0200
committerThomas Haller <thaller@redhat.com>2017-05-11 12:35:57 +0200
commitb98e328de180c61d14729d8f794bc909506689a7 (patch)
tree121f0775b08543d1cf22ae682697d9e11d423b5b
parente2595124616cb7c2367fab74e4f4189fea2fada8 (diff)
downloadNetworkManager-b98e328de180c61d14729d8f794bc909506689a7.tar.gz
libnm: use CList instead of GSList for notify_items in "nm-object.c"
-rw-r--r--libnm/nm-object.c42
1 files changed, 26 insertions, 16 deletions
diff --git a/libnm/nm-object.c b/libnm/nm-object.c
index 95346e06e9..5a521f0b8f 100644
--- a/libnm/nm-object.c
+++ b/libnm/nm-object.c
@@ -33,6 +33,7 @@
#include "nm-dbus-helpers.h"
#include "nm-client.h"
#include "nm-core-internal.h"
+#include "nm-utils/c-list.h"
static gboolean debug = FALSE;
#define dbgmsg(f,...) if (G_UNLIKELY (debug)) { g_message (f, ## __VA_ARGS__ ); }
@@ -77,7 +78,7 @@ typedef struct {
GSList *waiters; /* if async init did not finish, users of this object need
* to defer their notifications by adding themselves here. */
- GSList *notify_items;
+ CList notify_items;
guint32 notify_id;
GSList *reload_results;
@@ -152,6 +153,7 @@ typedef enum {
} NotifySignalPending;
typedef struct {
+ CList lst;
const char *property;
const char *signal_prefix;
NotifySignalPending pending;
@@ -161,6 +163,7 @@ typedef struct {
static void
notify_item_free (NotifyItem *item)
{
+ c_list_unlink (&item->lst);
g_clear_object (&item->changed);
g_slice_free (NotifyItem, item);
}
@@ -171,7 +174,8 @@ deferred_notify_cb (gpointer data)
NMObject *object = NM_OBJECT (data);
NMObjectPrivate *priv = NM_OBJECT_GET_PRIVATE (object);
NMObjectClass *object_class = NM_OBJECT_GET_CLASS (object);
- GSList *props, *iter;
+ CList props;
+ CList *iter, *safe;
priv->notify_id = 0;
@@ -184,16 +188,16 @@ deferred_notify_cb (gpointer data)
* during the g_object_notify() call separately from the property
* list we're iterating.
*/
- props = g_slist_reverse (priv->notify_items);
- priv->notify_items = NULL;
+ c_list_link_after (&priv->notify_items, &props);
+ c_list_unlink_init (&priv->notify_items);
g_object_ref (object);
/* Emit added/removed signals first since some of our internal objects
* use the added/removed signals for new object processing.
*/
- for (iter = props; iter; iter = g_slist_next (iter)) {
- NotifyItem *item = iter->data;
+ c_list_for_each (iter, &props) {
+ NotifyItem *item = c_list_entry (iter, NotifyItem, lst);
char buf[50];
gint ret = 0;
@@ -219,8 +223,8 @@ deferred_notify_cb (gpointer data)
}
/* Emit property change notifications second */
- for (iter = props; iter; iter = g_slist_next (iter)) {
- NotifyItem *item = iter->data;
+ c_list_for_each (iter, &props) {
+ NotifyItem *item = c_list_entry (iter, NotifyItem, lst);
if (item->property)
g_object_notify (G_OBJECT (object), item->property);
@@ -228,7 +232,9 @@ deferred_notify_cb (gpointer data)
g_object_unref (object);
- g_slist_free_full (props, (GDestroyNotify) notify_item_free);
+ c_list_for_each_safe (iter, safe, &props)
+ notify_item_free (c_list_entry (iter, NotifyItem, lst));
+
return G_SOURCE_REMOVE;
}
@@ -250,7 +256,7 @@ _nm_object_queue_notify_full (NMObject *object,
{
NMObjectPrivate *priv;
NotifyItem *item;
- GSList *iter;
+ CList *iter;
g_return_if_fail (NM_IS_OBJECT (object));
g_return_if_fail (!signal_prefix != !property);
@@ -261,8 +267,8 @@ _nm_object_queue_notify_full (NMObject *object,
property = g_intern_string (property);
signal_prefix = g_intern_string (signal_prefix);
- for (iter = priv->notify_items; iter; iter = g_slist_next (iter)) {
- item = iter->data;
+ c_list_for_each (iter, &priv->notify_items) {
+ item = c_list_entry (iter, NotifyItem, lst);
if (property && (property == item->property))
return;
@@ -314,7 +320,7 @@ _nm_object_queue_notify_full (NMObject *object,
item->pending = added ? NOTIFY_SIGNAL_PENDING_ADDED : NOTIFY_SIGNAL_PENDING_REMOVED;
item->changed = changed ? g_object_ref (changed) : NULL;
}
- priv->notify_items = g_slist_prepend (priv->notify_items, item);
+ c_list_link_tail (&priv->notify_items, &item->lst);
}
void
@@ -1194,7 +1200,10 @@ nm_object_async_initable_iface_init (GAsyncInitableIface *iface)
static void
nm_object_init (NMObject *object)
{
- NM_OBJECT_GET_PRIVATE (object)->proxies = g_ptr_array_new ();
+ NMObjectPrivate *priv = NM_OBJECT_GET_PRIVATE (object);
+
+ c_list_init (&priv->notify_items);
+ priv->proxies = g_ptr_array_new ();
}
static void
@@ -1249,12 +1258,13 @@ static void
dispose (GObject *object)
{
NMObjectPrivate *priv = NM_OBJECT_GET_PRIVATE (object);
+ CList *iter, *safe;
guint i;
nm_clear_g_source (&priv->notify_id);
- g_slist_free_full (priv->notify_items, (GDestroyNotify) notify_item_free);
- priv->notify_items = NULL;
+ c_list_for_each_safe (iter, safe, &priv->notify_items)
+ notify_item_free (c_list_entry (iter, NotifyItem, lst));
g_slist_free_full (priv->waiters, odata_free);