Avoid Valgrind message due to glibc bug. (#3768)

This commit is contained in:
Nikolay Igotti
2020-01-21 14:54:08 +03:00
committed by GitHub
parent 9e558ca32c
commit dd270930c1
+13 -1
View File
@@ -119,7 +119,7 @@ void consolePrintf(const char* format, ...) {
#if !KONAN_NO_THREADS
pthread_key_t terminationKey;
pthread_once_t terminationKeyOnceControl = PTHREAD_ONCE_INIT;
pthread_once_t terminationKeyOnceControl = PTHREAD_ONCE_INIT;
typedef void (*destructor_t)(void*);
@@ -140,7 +140,19 @@ static void onThreadExitCallback(void* value) {
pthread_setspecific(terminationKey, nullptr);
}
#if KONAN_LINUX
static pthread_key_t dummyKey;
#endif
static void onThreadExitInit() {
#if KONAN_LINUX
// Due to glibc bug we have to create first key as dummy, to avoid
// conflicts with potentially uninitialized dlfcn error key.
// https://code.woboq.org/userspace/glibc/dlfcn/dlerror.c.html#237
// As one may see, glibc checks value of the key even if it was not inited (and == 0),
// and so data associated with our legit key (== 0 as being the first one) is used.
// Other libc are not affected, as usually == 0 pthread key is impossible.
pthread_key_create(&dummyKey, nullptr);
#endif
pthread_key_create(&terminationKey, onThreadExitCallback);
}