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