diff options
Diffstat (limited to 'recipes-qt/qt5/qtbase/0020-Revert-Fix-workaround-in-pthread-destructor.patch')
-rw-r--r-- | recipes-qt/qt5/qtbase/0020-Revert-Fix-workaround-in-pthread-destructor.patch | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/recipes-qt/qt5/qtbase/0020-Revert-Fix-workaround-in-pthread-destructor.patch b/recipes-qt/qt5/qtbase/0020-Revert-Fix-workaround-in-pthread-destructor.patch new file mode 100644 index 00000000..c397ddb3 --- /dev/null +++ b/recipes-qt/qt5/qtbase/0020-Revert-Fix-workaround-in-pthread-destructor.patch | |||
@@ -0,0 +1,67 @@ | |||
1 | From aeaea761f21e5430d3199d2ca4414d18ed7b0fd5 Mon Sep 17 00:00:00 2001 | ||
2 | From: Martin Jansa <Martin.Jansa@gmail.com> | ||
3 | Date: Tue, 26 Jan 2021 08:50:45 +0100 | ||
4 | Subject: [PATCH] Revert "Fix workaround in pthread destructor" | ||
5 | |||
6 | This reverts commit 81ce2d1d6fa741de4d27b939a378147a02019ec1. | ||
7 | |||
8 | currentThreadData was reverted in 5.12 before this commit: | ||
9 | |||
10 | 81ce2d1d6f Fix workaround in pthread destructor | ||
11 | 8867e0eaa7 Revert "Remove pthread storage for thread local data" | ||
12 | 78665d8a0c Remove pthread storage for thread local data | ||
13 | |||
14 | causing 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 | |||
20 | --- | ||
21 | src/corelib/thread/qthread_unix.cpp | 25 +++++++++++++++++++------ | ||
22 | 1 file changed, 19 insertions(+), 6 deletions(-) | ||
23 | |||
24 | diff --git a/src/corelib/thread/qthread_unix.cpp b/src/corelib/thread/qthread_unix.cpp | ||
25 | index 659d5fb03c..1da68b3130 100644 | ||
26 | --- a/src/corelib/thread/qthread_unix.cpp | ||
27 | +++ b/src/corelib/thread/qthread_unix.cpp | ||
28 | @@ -116,11 +116,18 @@ static pthread_key_t current_thread_data_key; | ||
29 | |||
30 | static void destroy_current_thread_data(void *p) | ||
31 | { | ||
32 | +#if defined(Q_OS_VXWORKS) | ||
33 | + // Calling setspecific(..., 0) sets the value to 0 for ALL threads. | ||
34 | + // The 'set to 1' workaround adds a bit of an overhead though, | ||
35 | + // since this function is called twice now. | ||
36 | + if (p == (void *)1) | ||
37 | + return; | ||
38 | +#endif | ||
39 | + // POSIX says the value in our key is set to zero before calling | ||
40 | + // this destructor function, so we need to set it back to the | ||
41 | + // right value... | ||
42 | + pthread_setspecific(current_thread_data_key, p); | ||
43 | QThreadData *data = static_cast<QThreadData *>(p); | ||
44 | - // thread_local variables are set to zero before calling this destructor function, | ||
45 | - // if they are internally using pthread-specific data management, | ||
46 | - // so we need to set it back to the right value... | ||
47 | - currentThreadData = data; | ||
48 | if (data->isAdopted) { | ||
49 | QThread *thread = data->thread.loadAcquire(); | ||
50 | Q_ASSERT(thread); | ||
51 | @@ -131,8 +138,14 @@ static void destroy_current_thread_data(void *p) | ||
52 | data->deref(); | ||
53 | |||
54 | // ... but we must reset it to zero before returning so we aren't | ||
55 | - // leaving a dangling pointer. | ||
56 | - currentThreadData = nullptr; | ||
57 | + // called again (POSIX allows implementations to call destructor | ||
58 | + // functions repeatedly until all values are zero) | ||
59 | + pthread_setspecific(current_thread_data_key, | ||
60 | +#if defined(Q_OS_VXWORKS) | ||
61 | + (void *)1); | ||
62 | +#else | ||
63 | + nullptr); | ||
64 | +#endif | ||
65 | } | ||
66 | |||
67 | static void create_current_thread_data_key() | ||