]> granicus.if.org Git - gc/commitdiff
Reduce probability of collision in threads hashtable for 64-bit targets
authorIvan Maidanski <ivmai@mail.ru>
Mon, 26 Mar 2018 18:30:32 +0000 (21:30 +0300)
committerIvan Maidanski <ivmai@mail.ru>
Mon, 26 Mar 2018 18:30:32 +0000 (21:30 +0300)
* include/private/pthread_support.h [GC_PTHREADS && !GC_WIN32_THREADS
&& CPP_WORDSZ==64] (THREAD_TABLE_INDEX): Xor also 4th byte of id value.

include/private/pthread_support.h

index 8df6bc21f9d6b1b487bcf2f81183aad96dd0342e..ae5c2e9e74ebfc83539a4cf187b9f8a04991575b 100644 (file)
@@ -140,10 +140,17 @@ typedef struct GC_Thread_Rep {
 # define THREAD_TABLE_SZ 256    /* Power of 2 (for speed). */
 #endif
 
-#define THREAD_TABLE_INDEX(id) \
+#if CPP_WORDSZ == 64
+# define THREAD_TABLE_INDEX(id) \
+    (int)(((((NUMERIC_THREAD_ID(id) >> 8) ^ NUMERIC_THREAD_ID(id)) >> 16) \
+          ^ ((NUMERIC_THREAD_ID(id) >> 8) ^ NUMERIC_THREAD_ID(id))) \
+         % THREAD_TABLE_SZ)
+#else
+# define THREAD_TABLE_INDEX(id) \
                 (int)(((NUMERIC_THREAD_ID(id) >> 16) \
                        ^ (NUMERIC_THREAD_ID(id) >> 8) \
                        ^ NUMERIC_THREAD_ID(id)) % THREAD_TABLE_SZ)
+#endif
 
 GC_EXTERN volatile GC_thread GC_threads[THREAD_TABLE_SZ];