diff options
| author | Simon McVittie <simon.mcvittie@collabora.co.uk> | 2013-01-08 18:21:38 +0000 |
|---|---|---|
| committer | Simon McVittie <simon.mcvittie@collabora.co.uk> | 2013-01-08 18:21:38 +0000 |
| commit | e5cd53ee8ebca0d0839ad1345183adc93510335b (patch) | |
| tree | 891d0aa70c8047064927fdb1e93d24f9a5c918d7 | |
| parent | 0f1435f548071f873d7626643f250b04b53931c9 (diff) | |
Stop using qdata on handles to cache nicknameswip-less-qdata
It's much simpler to use a hash table like everyone else, and this is
no more leaky than qdata now that handles share the connection's
lifetime.
Also stop using a special non-null pointer as a value for negative
caching, and just use NULL: unlike TpHandle qdata, hash tables have
g_hash_table_lookup_extended.
| -rw-r--r-- | src/vcard-manager.c | 49 | ||||
| -rw-r--r-- | src/vcard-manager.h | 2 |
2 files changed, 19 insertions, 32 deletions
diff --git a/src/vcard-manager.c b/src/vcard-manager.c index 39fd4a3e0..bd45e236c 100644 --- a/src/vcard-manager.c +++ b/src/vcard-manager.c @@ -46,8 +46,6 @@ static guint default_request_timeout = 180; * the same recipient */ static guint request_wait_delay = 5 * 60; -static const gchar *NO_ALIAS = "none"; - struct _GabbleVCardManagerEditInfo { /* name of element to edit */ gchar *element_name; @@ -100,6 +98,9 @@ struct _GabbleVCardManagerPrivate gboolean dispose_has_run; GabbleConnection *connection; + /* TpHandle => owned string, which may be "" as a negative cache entry */ + GHashTable *nickname_cache; + /* TpHandle borrowed from the entry => owned (GabbleVCardCacheEntry *) */ GHashTable *cache; @@ -199,15 +200,6 @@ gabble_vcard_manager_error_quark (void) return quark; } -GQuark -gabble_vcard_manager_cache_quark (void) -{ - static GQuark quark = 0; - if (!quark) - quark = g_quark_from_static_string ("gabble-vcard-manager-cache"); - return quark; -} - static void cache_entry_free (void *data); static gint cache_entry_compare (gconstpointer a, gconstpointer b); static void manager_patch_vcard ( @@ -229,6 +221,8 @@ gabble_vcard_manager_init (GabbleVCardManager *obj) priv->timed_cache = tp_heap_new (cache_entry_compare, NULL); priv->cache_timer = 0; + priv->nickname_cache = g_hash_table_new_full (NULL, NULL, NULL, g_free); + priv->have_self_avatar = FALSE; priv->edits = NULL; } @@ -576,7 +570,12 @@ gabble_vcard_manager_dispose (GObject *object) static void gabble_vcard_manager_finalize (GObject *object) { + GabbleVCardManager *self = GABBLE_VCARD_MANAGER (object); + DEBUG ("%p", object); + + g_hash_table_unref (self->priv->nickname_cache); + G_OBJECT_CLASS (gabble_vcard_manager_parent_class)->finalize (object); } @@ -804,8 +803,6 @@ observe_vcard (GabbleConnection *conn, TpHandle handle, WockyNode *vcard_node) { - TpHandleRepoIface *contact_repo = tp_base_connection_get_handles ( - (TpBaseConnection *) conn, TP_HANDLE_TYPE_CONTACT); const gchar *field = "<NICKNAME>"; gchar *alias; const gchar *old_alias; @@ -846,15 +843,15 @@ observe_vcard (GabbleConnection *conn, handle, field); /* takes ownership of alias */ - tp_handle_set_qdata (contact_repo, handle, - gabble_vcard_manager_cache_quark (), alias, g_free); + g_hash_table_insert (manager->priv->nickname_cache, + GUINT_TO_POINTER (handle), alias); } else { DEBUG ("got no vCard alias for handle %u", handle); - tp_handle_set_qdata (contact_repo, handle, - gabble_vcard_manager_cache_quark (), (gchar *) NO_ALIAS, NULL); + g_hash_table_insert (manager->priv->nickname_cache, + GUINT_TO_POINTER (handle), NULL); } if ((old_alias != NULL) || (alias != NULL)) @@ -1649,7 +1646,6 @@ gabble_vcard_manager_get_cached_alias (GabbleVCardManager *self, { GabbleVCardManagerPrivate *priv; TpHandleRepoIface *contact_repo; - const gchar *s; g_return_val_if_fail (GABBLE_IS_VCARD_MANAGER (self), NULL); @@ -1659,17 +1655,13 @@ gabble_vcard_manager_get_cached_alias (GabbleVCardManager *self, g_return_val_if_fail (tp_handle_is_valid (contact_repo, handle, NULL), NULL); - s = tp_handle_get_qdata (contact_repo, handle, - gabble_vcard_manager_cache_quark ()); - - if (s == NO_ALIAS) - s = NULL; - - return s; + return g_hash_table_lookup (priv->nickname_cache, GUINT_TO_POINTER (handle)); } /** * Return TRUE if we've tried looking up an alias for this handle before. + * In particular, return TRUE if we have a negative cache entry indicating + * that there is no vCard-based alias. */ gboolean gabble_vcard_manager_has_cached_alias (GabbleVCardManager *self, @@ -1677,7 +1669,6 @@ gabble_vcard_manager_has_cached_alias (GabbleVCardManager *self, { GabbleVCardManagerPrivate *priv; TpHandleRepoIface *contact_repo; - gpointer p; g_return_val_if_fail (GABBLE_IS_VCARD_MANAGER (self), FALSE); @@ -1688,10 +1679,8 @@ gabble_vcard_manager_has_cached_alias (GabbleVCardManager *self, g_return_val_if_fail (tp_handle_is_valid (contact_repo, handle, NULL), FALSE); - p = tp_handle_get_qdata (contact_repo, handle, - gabble_vcard_manager_cache_quark ()); - - return p != NULL; + return g_hash_table_lookup_extended (priv->nickname_cache, + GUINT_TO_POINTER (handle), NULL, NULL); } /* For unit tests only */ diff --git a/src/vcard-manager.h b/src/vcard-manager.h index 8f877050a..0a212b783 100644 --- a/src/vcard-manager.h +++ b/src/vcard-manager.h @@ -96,8 +96,6 @@ typedef void (*GabbleVCardManagerCb)(GabbleVCardManager *self, GabbleVCardManager *gabble_vcard_manager_new (GabbleConnection *); -GQuark gabble_vcard_manager_cache_quark (void); - GabbleVCardManagerRequest *gabble_vcard_manager_request (GabbleVCardManager *, TpHandle, guint timeout, |
