Add a method to get the pspec name quark

This lets us avoid the quark lookup in the hot
property change notification path.
This commit is contained in:
Matthias Clasen 2015-09-07 20:54:01 -04:00
parent a62ad79f5c
commit 41c0d15a6d
3 changed files with 35 additions and 3 deletions

View File

@ -513,6 +513,7 @@ g_param_value_validate
g_param_value_convert g_param_value_convert
g_param_values_cmp g_param_values_cmp
g_param_spec_get_name g_param_spec_get_name
g_param_spec_get_name_quark
g_param_spec_get_nick g_param_spec_get_nick
g_param_spec_get_blurb g_param_spec_get_blurb
g_param_spec_get_qdata g_param_spec_get_qdata

View File

@ -81,6 +81,7 @@ static gchar* value_param_lcopy_value (const GValue *value,
typedef struct typedef struct
{ {
GValue default_value; GValue default_value;
GQuark name_quark;
} GParamSpecPrivate; } GParamSpecPrivate;
static gint g_param_private_offset; static gint g_param_private_offset;
@ -426,6 +427,7 @@ g_param_spec_internal (GType param_type,
GParamFlags flags) GParamFlags flags)
{ {
GParamSpec *pspec; GParamSpec *pspec;
GParamSpecPrivate *priv;
g_return_val_if_fail (G_TYPE_IS_PARAM (param_type) && param_type != G_TYPE_PARAM, NULL); g_return_val_if_fail (G_TYPE_IS_PARAM (param_type) && param_type != G_TYPE_PARAM, NULL);
g_return_val_if_fail (name != NULL, NULL); g_return_val_if_fail (name != NULL, NULL);
@ -454,6 +456,9 @@ g_param_spec_internal (GType param_type,
} }
} }
priv = g_param_spec_get_private (pspec);
priv->name_quark = g_quark_from_string (pspec->name);
if (flags & G_PARAM_STATIC_NICK) if (flags & G_PARAM_STATIC_NICK)
pspec->_nick = (gchar*) nick; pspec->_nick = (gchar*) nick;
else else
@ -1520,11 +1525,11 @@ g_value_dup_param (const GValue *value)
/** /**
* g_param_spec_get_default_value: * g_param_spec_get_default_value:
* @param: a #GParamSpec * @pspec: a #GParamSpec
* *
* Gets the default value of @param as a pointer to a #GValue. * Gets the default value of @pspec as a pointer to a #GValue.
* *
* The #GValue will remain value for the life of @param. * The #GValue will remain value for the life of @pspec.
* *
* Returns: a pointer to a #GValue which must not be modified * Returns: a pointer to a #GValue which must not be modified
* *
@ -1564,3 +1569,26 @@ g_param_spec_get_default_value (GParamSpec *pspec)
return &priv->default_value; return &priv->default_value;
} }
/**
* g_param_spec_get_name_quark:
* @param: a #GParamSpec
*
* Gets the GQuark for the name.
*
* Returns: the GQuark for @pspec->name.
*
* Since: 2.38
*/
GQuark
g_param_spec_get_name_quark (GParamSpec *pspec)
{
GParamSpecPrivate *priv = g_param_spec_get_private (pspec);
/* Return the quark that we've stashed away at creation time.
* This lets us avoid a lock and a hash table lookup when
* dispatching property change notification.
*/
return priv->name_quark;
}

View File

@ -343,6 +343,9 @@ void g_value_set_param_take_ownership (GValue *value,
GLIB_AVAILABLE_IN_2_36 GLIB_AVAILABLE_IN_2_36
const GValue * g_param_spec_get_default_value (GParamSpec *param); const GValue * g_param_spec_get_default_value (GParamSpec *param);
GLIB_AVAILABLE_IN_2_46
GQuark g_param_spec_get_name_quark (GParamSpec *param);
/* --- convenience functions --- */ /* --- convenience functions --- */
typedef struct _GParamSpecTypeInfo GParamSpecTypeInfo; typedef struct _GParamSpecTypeInfo GParamSpecTypeInfo;
/** /**