mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2025-04-01 13:23:07 +02:00
Merge branch 'th/main-sources-dict-as-set' into 'main'
gmain: optimize "context->sources" hash table to use as set See merge request GNOME/glib!3664
This commit is contained in:
commit
c17090275c
44
glib/ghash.c
44
glib/ghash.c
@ -2552,6 +2552,50 @@ g_int_hash (gconstpointer v)
|
|||||||
return *(const gint*) v;
|
return *(const gint*) v;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* g_uint_equal:
|
||||||
|
* @v1: (not nullable): a pointer to a #guint key
|
||||||
|
* @v2: (not nullable): a pointer to a #guint key to compare with @v1
|
||||||
|
*
|
||||||
|
* Compares the two #guint values being pointed to and returns
|
||||||
|
* %TRUE if they are equal.
|
||||||
|
* It can be passed to g_hash_table_new() as the @key_equal_func
|
||||||
|
* parameter, when using non-%NULL pointers to integers as keys in a
|
||||||
|
* #GHashTable.
|
||||||
|
*
|
||||||
|
* Note that this function acts on pointers to #guint, not on #guint
|
||||||
|
* directly: if your hash table's keys are of the form
|
||||||
|
* `GUINT_TO_POINTER (n)`, use g_direct_equal() instead.
|
||||||
|
*
|
||||||
|
* Returns: %TRUE if the two keys match.
|
||||||
|
*/
|
||||||
|
gboolean
|
||||||
|
g_uint_equal (gconstpointer v1,
|
||||||
|
gconstpointer v2)
|
||||||
|
{
|
||||||
|
return *((const guint *) v1) == *((const guint *) v2);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* g_uint_hash:
|
||||||
|
* @v: (not nullable): a pointer to a #guint key
|
||||||
|
*
|
||||||
|
* Converts a pointer to a #guint to a hash value.
|
||||||
|
* It can be passed to g_hash_table_new() as the @hash_func parameter,
|
||||||
|
* when using non-%NULL pointers to integer values as keys in a #GHashTable.
|
||||||
|
*
|
||||||
|
* Note that this function acts on pointers to #guint, not on #guint
|
||||||
|
* directly: if your hash table's keys are of the form
|
||||||
|
* `GUINT_TO_POINTER (n)`, use g_direct_hash() instead.
|
||||||
|
*
|
||||||
|
* Returns: a hash value corresponding to the key.
|
||||||
|
*/
|
||||||
|
guint
|
||||||
|
g_uint_hash (gconstpointer v)
|
||||||
|
{
|
||||||
|
return *(const guint *) v;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* g_int64_equal:
|
* g_int64_equal:
|
||||||
* @v1: (not nullable): a pointer to a #gint64 key
|
* @v1: (not nullable): a pointer to a #gint64 key
|
||||||
|
@ -63,6 +63,18 @@ void __lsan_ignore_object (const void *p) __attribute__ ((weak));
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* G_CONTAINER_OF:
|
||||||
|
* @ptr: a pointer to a member @field of type @type.
|
||||||
|
* @type: the type of the container in which @field is embedded.
|
||||||
|
* @field: the name of the field in @type.
|
||||||
|
*
|
||||||
|
* Casts away constness of @ptr.
|
||||||
|
*
|
||||||
|
* Returns: a pointer to the container, so that "&(@container)->field == (@ptr)" holds.
|
||||||
|
*/
|
||||||
|
#define G_CONTAINER_OF(ptr, type, field) ((type *) G_STRUCT_MEMBER_P (ptr, -G_STRUCT_OFFSET (type, field)))
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* g_leak_sanitizer_is_supported:
|
* g_leak_sanitizer_is_supported:
|
||||||
*
|
*
|
||||||
@ -303,4 +315,7 @@ GLibPrivateVTable *glib__private__ (void);
|
|||||||
# define GLIB_DEFAULT_LOCALE ""
|
# define GLIB_DEFAULT_LOCALE ""
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
gboolean g_uint_equal (gconstpointer v1, gconstpointer v2);
|
||||||
|
guint g_uint_hash (gconstpointer v);
|
||||||
|
|
||||||
#endif /* __GLIB_PRIVATE_H__ */
|
#endif /* __GLIB_PRIVATE_H__ */
|
||||||
|
22
glib/gmain.c
22
glib/gmain.c
@ -637,7 +637,7 @@ g_main_context_new_with_flags (GMainContextFlags flags)
|
|||||||
g_mutex_init (&context->mutex);
|
g_mutex_init (&context->mutex);
|
||||||
g_cond_init (&context->cond);
|
g_cond_init (&context->cond);
|
||||||
|
|
||||||
context->sources = g_hash_table_new (NULL, NULL);
|
context->sources = g_hash_table_new (g_uint_hash, g_uint_equal);
|
||||||
context->owner = NULL;
|
context->owner = NULL;
|
||||||
context->flags = flags;
|
context->flags = flags;
|
||||||
context->waiters = NULL;
|
context->waiters = NULL;
|
||||||
@ -1166,13 +1166,13 @@ g_source_attach_unlocked (GSource *source,
|
|||||||
*/
|
*/
|
||||||
do
|
do
|
||||||
id = context->next_id++;
|
id = context->next_id++;
|
||||||
while (id == 0 || g_hash_table_contains (context->sources, GUINT_TO_POINTER (id)));
|
while (id == 0 || g_hash_table_contains (context->sources, &id));
|
||||||
|
|
||||||
source->context = context;
|
source->context = context;
|
||||||
source->source_id = id;
|
source->source_id = id;
|
||||||
g_source_ref (source);
|
g_source_ref (source);
|
||||||
|
|
||||||
g_hash_table_insert (context->sources, GUINT_TO_POINTER (id), source);
|
g_hash_table_add (context->sources, &source->source_id);
|
||||||
|
|
||||||
source_add_to_context (source, context);
|
source_add_to_context (source, context);
|
||||||
|
|
||||||
@ -2239,7 +2239,7 @@ g_source_unref_internal (GSource *source,
|
|||||||
g_warning (G_STRLOC ": ref_count == 0, but source was still attached to a context!");
|
g_warning (G_STRLOC ": ref_count == 0, but source was still attached to a context!");
|
||||||
source_remove_from_context (source, context);
|
source_remove_from_context (source, context);
|
||||||
|
|
||||||
g_hash_table_remove (context->sources, GUINT_TO_POINTER (source->source_id));
|
g_hash_table_remove (context->sources, &source->source_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (source->source_funcs->finalize)
|
if (source->source_funcs->finalize)
|
||||||
@ -2348,7 +2348,8 @@ GSource *
|
|||||||
g_main_context_find_source_by_id (GMainContext *context,
|
g_main_context_find_source_by_id (GMainContext *context,
|
||||||
guint source_id)
|
guint source_id)
|
||||||
{
|
{
|
||||||
GSource *source;
|
GSource *source = NULL;
|
||||||
|
gconstpointer ptr;
|
||||||
|
|
||||||
g_return_val_if_fail (source_id > 0, NULL);
|
g_return_val_if_fail (source_id > 0, NULL);
|
||||||
|
|
||||||
@ -2356,12 +2357,15 @@ g_main_context_find_source_by_id (GMainContext *context,
|
|||||||
context = g_main_context_default ();
|
context = g_main_context_default ();
|
||||||
|
|
||||||
LOCK_CONTEXT (context);
|
LOCK_CONTEXT (context);
|
||||||
source = g_hash_table_lookup (context->sources, GUINT_TO_POINTER (source_id));
|
ptr = g_hash_table_lookup (context->sources, &source_id);
|
||||||
|
if (ptr)
|
||||||
|
{
|
||||||
|
source = G_CONTAINER_OF (ptr, GSource, source_id);
|
||||||
|
if (SOURCE_DESTROYED (source))
|
||||||
|
source = NULL;
|
||||||
|
}
|
||||||
UNLOCK_CONTEXT (context);
|
UNLOCK_CONTEXT (context);
|
||||||
|
|
||||||
if (source && SOURCE_DESTROYED (source))
|
|
||||||
source = NULL;
|
|
||||||
|
|
||||||
return source;
|
return source;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user