1From d46b92ecdae0c7dd2f284e3333641866aab4f604 Mon Sep 17 00:00:00 2001 2From: Martin Jansa <Martin.Jansa@gmail.com> 3Date: Tue, 26 Jan 2021 08:50:45 +0100 4Subject: [PATCH] Revert "Fix workaround in pthread destructor" 5 6This reverts commit 81ce2d1d6fa741de4d27b939a378147a02019ec1. 7 8currentThreadData was reverted in 5.12 before this commit: 9 1081ce2d1d6f Fix workaround in pthread destructor 118867e0eaa7 Revert "Remove pthread storage for thread local data" 1278665d8a0c Remove pthread storage for thread local data 13 14causing build failures in configurations which use this 15| /home/jenkins/workspace/luneos-unstable/webos-ports/tmp-glibc/work/cortexa8t2hf-neon-halium-webos-linux-gnueabi/qtbase/5.15.2+gitAUTOINC+40143c189b-r0/git/src/corelib/thread/qthread_unix.cpp: In function 'void destroy_current_thread_data(void*)': 16| /home/jenkins/workspace/luneos-unstable/webos-ports/tmp-glibc/work/cortexa8t2hf-neon-halium-webos-linux-gnueabi/qtbase/5.15.2+gitAUTOINC+40143c189b-r0/git/src/corelib/thread/qthread_unix.cpp:121:5: error: 'currentThreadData' was not declared in this scope 17| 121 | currentThreadData = data; 18| | ^~~~~~~~~~~~~~~~~ 19 20Upstream-Status: Pending 21Signed-off-by: Martin Jansa <Martin.Jansa@gmail.com> 22--- 23 src/corelib/thread/qthread_unix.cpp | 25 +++++++++++++++++++------ 24 1 file changed, 19 insertions(+), 6 deletions(-) 25 26diff --git a/src/corelib/thread/qthread_unix.cpp b/src/corelib/thread/qthread_unix.cpp 27index 659d5fb03c..1da68b3130 100644 28--- a/src/corelib/thread/qthread_unix.cpp 29+++ b/src/corelib/thread/qthread_unix.cpp 30@@ -116,11 +116,18 @@ static pthread_key_t current_thread_data_key; 31 32 static void destroy_current_thread_data(void *p) 33 { 34+#if defined(Q_OS_VXWORKS) 35+ // Calling setspecific(..., 0) sets the value to 0 for ALL threads. 36+ // The 'set to 1' workaround adds a bit of an overhead though, 37+ // since this function is called twice now. 38+ if (p == (void *)1) 39+ return; 40+#endif 41+ // POSIX says the value in our key is set to zero before calling 42+ // this destructor function, so we need to set it back to the 43+ // right value... 44+ pthread_setspecific(current_thread_data_key, p); 45 QThreadData *data = static_cast<QThreadData *>(p); 46- // thread_local variables are set to zero before calling this destructor function, 47- // if they are internally using pthread-specific data management, 48- // so we need to set it back to the right value... 49- currentThreadData = data; 50 if (data->isAdopted) { 51 QThread *thread = data->thread.loadAcquire(); 52 Q_ASSERT(thread); 53@@ -131,8 +138,14 @@ static void destroy_current_thread_data(void *p) 54 data->deref(); 55 56 // ... but we must reset it to zero before returning so we aren't 57- // leaving a dangling pointer. 58- currentThreadData = nullptr; 59+ // called again (POSIX allows implementations to call destructor 60+ // functions repeatedly until all values are zero) 61+ pthread_setspecific(current_thread_data_key, 62+#if defined(Q_OS_VXWORKS) 63+ (void *)1); 64+#else 65+ nullptr); 66+#endif 67 } 68 69 static void create_current_thread_data_key() 70