summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2017-11-24 16:21:40 +0100
committerThomas Haller <thaller@redhat.com>2017-11-24 16:44:28 +0100
commita3569eddf2a4606d99f998bac19dae251690b492 (patch)
treedff76c8d0d8e87c12250599dbfdd80e15a5dc768
parent1cbbefcdddffc4dcf66eb2d7e58cc6c46bc08dca (diff)
downloadNetworkManager-th/call-id-cleanup.tar.gz
core: use CList to track NMActRequestGetSecretsCallId in NMActRequestth/call-id-cleanup
Gives O(1) insert and remove. Also saves the overhead of the GSlice allocation for the GSList node.
-rw-r--r--src/nm-act-request.c49
1 files changed, 24 insertions, 25 deletions
diff --git a/src/nm-act-request.c b/src/nm-act-request.c
index 781190ac7f..25a1dd9b4f 100644
--- a/src/nm-act-request.c
+++ b/src/nm-act-request.c
@@ -28,6 +28,8 @@
#include <sys/wait.h>
#include <unistd.h>
+#include "nm-utils/c-list.h"
+
#include "nm-setting-wireless-security.h"
#include "nm-setting-8021x.h"
#include "devices/nm-device.h"
@@ -41,7 +43,7 @@ typedef struct {
} ShareRule;
typedef struct {
- GSList *secrets_calls;
+ CList call_ids_lst_head;
gboolean shared;
GSList *share_rules;
} NMActRequestPrivate;
@@ -90,6 +92,7 @@ nm_act_request_get_applied_connection (NMActRequest *req)
/*****************************************************************************/
struct _NMActRequestGetSecretsCallId {
+ CList call_ids_lst;
NMActRequest *self;
NMActRequestSecretsFunc callback;
gpointer callback_data;
@@ -97,23 +100,12 @@ struct _NMActRequestGetSecretsCallId {
bool has_ref;
};
-static NMActRequestGetSecretsCallId *
-_get_secrets_call_id_new (NMActRequest *self, gboolean ref_self, NMActRequestSecretsFunc callback, gpointer callback_data)
-{
- NMActRequestGetSecretsCallId *call_id;
-
- call_id = g_slice_new0 (NMActRequestGetSecretsCallId);
- call_id->has_ref = ref_self;
- call_id->self = ref_self ? g_object_ref (self) : self;
- call_id->callback = callback;
- call_id->callback_data = callback_data;
-
- return call_id;
-}
-
static void
_get_secrets_call_id_free (NMActRequestGetSecretsCallId *call_id)
{
+ nm_assert (call_id);
+ nm_assert (!c_list_is_linked (&call_id->call_ids_lst));
+
if (call_id->has_ref)
g_object_unref (call_id->self);
g_slice_free (NMActRequestGetSecretsCallId, call_id);
@@ -138,9 +130,9 @@ get_secrets_cb (NMSettingsConnection *connection,
priv = NM_ACT_REQUEST_GET_PRIVATE (call_id->self);
- g_return_if_fail (g_slist_find (priv->secrets_calls, call_id));
+ nm_assert (c_list_contains (&priv->call_ids_lst_head, &call_id->call_ids_lst));
- priv->secrets_calls = g_slist_remove (priv->secrets_calls, call_id);
+ c_list_unlink_init (&call_id->call_ids_lst);
if (call_id->callback)
call_id->callback (call_id->self, call_id, connection, error, call_id->callback_data);
@@ -192,9 +184,12 @@ nm_act_request_get_secrets (NMActRequest *self,
settings_connection = nm_act_request_get_settings_connection (self);
applied_connection = nm_act_request_get_applied_connection (self);
- call_id = _get_secrets_call_id_new (self, ref_self, callback, callback_data);
-
- priv->secrets_calls = g_slist_append (priv->secrets_calls, call_id);
+ call_id = g_slice_new0 (NMActRequestGetSecretsCallId);
+ call_id->has_ref = ref_self;
+ call_id->self = ref_self ? g_object_ref (self) : self;
+ call_id->callback = callback;
+ call_id->callback_data = callback_data;
+ c_list_link_tail (&priv->call_ids_lst_head, &call_id->call_ids_lst);
if (nm_active_connection_get_user_requested (NM_ACTIVE_CONNECTION (self)))
flags |= NM_SECRET_AGENT_GET_SECRETS_FLAG_USER_REQUESTED;
@@ -218,9 +213,9 @@ _do_cancel_secrets (NMActRequest *self, NMActRequestGetSecretsCallId *call_id, g
NMActRequestPrivate *priv = NM_ACT_REQUEST_GET_PRIVATE (self);
nm_assert (call_id && call_id->self == self);
- nm_assert (g_slist_find (priv->secrets_calls, call_id));
+ nm_assert (c_list_contains (&priv->call_ids_lst_head, &call_id->call_ids_lst));
- priv->secrets_calls = g_slist_remove (priv->secrets_calls, call_id);
+ c_list_unlink_init (&call_id->call_ids_lst);
nm_settings_connection_cancel_secrets (nm_act_request_get_settings_connection (self), call_id->call_id);
@@ -262,7 +257,7 @@ nm_act_request_cancel_secrets (NMActRequest *self, NMActRequestGetSecretsCallId
priv = NM_ACT_REQUEST_GET_PRIVATE (self);
- if (!g_slist_find (priv->secrets_calls, call_id))
+ if (!c_list_is_linked (&call_id->call_ids_lst))
g_return_if_reached ();
_do_cancel_secrets (self, call_id, FALSE);
@@ -535,6 +530,9 @@ get_property (GObject *object, guint prop_id,
static void
nm_act_request_init (NMActRequest *req)
{
+ NMActRequestPrivate *priv = NM_ACT_REQUEST_GET_PRIVATE (req);
+
+ c_list_init (&priv->call_ids_lst_head);
}
/**
@@ -580,10 +578,11 @@ dispose (GObject *object)
{
NMActRequest *self = NM_ACT_REQUEST (object);
NMActRequestPrivate *priv = NM_ACT_REQUEST_GET_PRIVATE (self);
+ NMActRequestGetSecretsCallId *call_id, *call_id_safe;
/* Kill any in-progress secrets requests */
- while (priv->secrets_calls)
- _do_cancel_secrets (self, priv->secrets_calls->data, TRUE);
+ c_list_for_each_entry_safe (call_id, call_id_safe, &priv->call_ids_lst_head, call_ids_lst)
+ _do_cancel_secrets (self, call_id, TRUE);
/* Clear any share rules */
if (priv->share_rules) {