summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAllison Karlitskaya <allison.karlitskaya@redhat.com>2019-05-14 09:49:56 +0200
committerPhilip Withnall <withnall@endlessm.com>2019-05-14 16:51:11 +0100
commit75f8ec1df9b48b0c3a13a9125f2c7d7c5adf5159 (patch)
treed5033fba4683c887ff04831930417ea9ea5da16b
parent6729a82b0cb7b3153d08ee1c1e87c0121587bd4b (diff)
downloadglib-75f8ec1df9b48b0c3a13a9125f2c7d7c5adf5159.tar.gz
ghash: Disable small-arrays under valgrind
Valgrind can't find 64bit pointers when we pack them into an array of 32bit values. Disable this optimisation if we detect that we are running under valgrind. Fixes #1749
-rw-r--r--glib/ghash.c22
1 files changed, 17 insertions, 5 deletions
diff --git a/glib/ghash.c b/glib/ghash.c
index dac5552bd..c58e8c585 100644
--- a/glib/ghash.c
+++ b/glib/ghash.c
@@ -38,6 +38,7 @@
#include "gtestutils.h"
#include "gslice.h"
#include "grefcount.h"
+#include "gvalgrind.h"
/* The following #pragma is here so we can do this...
*
@@ -1014,6 +1015,7 @@ g_hash_table_new_full (GHashFunc hash_func,
GDestroyNotify value_destroy_func)
{
GHashTable *hash_table;
+ gboolean small;
hash_table = g_slice_new (GHashTable);
g_hash_table_set_shift (hash_table, HASH_TABLE_MIN_SHIFT);
@@ -1031,14 +1033,24 @@ g_hash_table_new_full (GHashFunc hash_func,
hash_table->values = hash_table->keys;
hash_table->hashes = g_new0 (guint, hash_table->size);
+ /* We want to use small arrays only if:
+ * - we are running on a system where that makes sense (64 bit); and
+ * - we are not running under valgrind.
+ */
+ small = FALSE;
+
#ifdef USE_SMALL_ARRAYS
- hash_table->have_big_keys = FALSE;
- hash_table->have_big_values = FALSE;
-#else
- hash_table->have_big_keys = TRUE;
- hash_table->have_big_values = TRUE;
+ small = TRUE;
+
+# ifdef ENABLE_VALGRIND
+ if (RUNNING_ON_VALGRIND)
+ small = FALSE;
+# endif
#endif
+ hash_table->have_big_keys = !small;
+ hash_table->have_big_values = !small;
+
return hash_table;
}