Merge branch '#0434_GSequenceSlowsDown_counter' into 'main'

gsequence: make treap priorities more random to avoid worst-case scenarios

Closes #2468

See merge request GNOME/glib!2236
This commit is contained in:
Philip Withnall
2021-09-21 10:40:48 +00:00
2 changed files with 54 additions and 13 deletions

View File

@@ -15,7 +15,8 @@ struct _GSequence
struct _GSequenceNode
{
guint n_nodes;
gint n_nodes;
guint32 priority;
GSequenceNode * parent;
GSequenceNode * left;
GSequenceNode * right;
@@ -25,15 +26,9 @@ struct _GSequenceNode
static guint
get_priority (GSequenceNode *node)
{
guint key = GPOINTER_TO_UINT (node);
key = (key << 15) - key - 1;
key = key ^ (key >> 12);
key = key + (key << 2);
key = key ^ (key >> 4);
key = key + (key << 3) + (key << 11);
key = key ^ (key >> 16);
guint key = node->priority;
/* We rely on 0 being less than all other priorities */
return key? key : 1;
}