]> granicus.if.org Git - gc/commit
Eliminate most of collisions in GC_threads on Linux/x64
authorIvan Maidanski <ivmai@mail.ru>
Thu, 24 Aug 2017 08:34:05 +0000 (11:34 +0300)
committerIvan Maidanski <ivmai@mail.ru>
Thu, 24 Aug 2017 08:35:33 +0000 (11:35 +0300)
commit85fce54e5f3c57c105123de5d4e5f4b027b5eb52
tree5cb0ce3178669e2bf58a500ee4f0ff13812988a9
parent6d7f13f0aa8f3f52fa19d52c0744176c06df1114
Eliminate most of collisions in GC_threads on Linux/x64

On some targets (e.g., Linux/x64) pthread_t values always have zero
in the lowest byte (e.g. if pthread_t is actually a page-aligned
pointer) thus causing all the created thread descriptors to have
a collision at GC_threads[0].  This commit mixes 3 lowest bytes
of thread id with a XOR operation (thus greatly reduces the
probability of collisions in GC_threads).

* include/private/pthread_support.h (THREAD_TABLE_SZ): Do not
define if already defined; refine comment.
* pthread_support.c (THREAD_TABLE_INDEX): New macro (similar to that
in win32_threads.c).
* pthread_support.c (GC_new_thread, GC_delete_thread,
GC_delete_gc_thread, GC_lookup_thread): Replace
NUMERIC_THREAD_ID(id)%THREAD_TABLE_SZ to THREAD_TABLE_INDEX(id).
* pthread_support.c (GC_lookup_thread): Remove hv local variable.
* win32_threads.c (THREAD_TABLE_INDEX): Replace (id>>2) to
((id>>16)^(id>>8)^id).
* win32_threads.c [GC_PTHREADS] (GC_lookup_pthread): Define win32_id
local variable to pass it to THREAD_TABLE_INDEX() instead of passing
GET_PTHREAD_MAP_CACHE(id) directly.
include/private/pthread_support.h
pthread_support.c
win32_threads.c