diff options
author | Michał Łoś <[email protected]> | 2024-10-31 11:08:59 +0100 |
---|---|---|
committer | Michał Łoś <[email protected]> | 2024-11-05 14:36:17 +0100 |
commit | a295f4f9130347d9708d77354bac85d58b495347 (patch) | |
tree | 347abbebaa9e0018f8b60cc2e6b36218cc872a2c | |
parent | dc1ae86bad0b4eaa83909f663777c09fb2f2376b (diff) |
Enable broken_threadlocal_dtors for VxWorks
Changes applied in commit 4fabde349f16b59f37568da2a4c050c6dd53a34e broke
VxWorks tests and examples, many of which crash with error:
```
pthreadLib: unable to create POSIX thread internal attributes.
```
This error appeared in multiple tests, but was tested on tst_QSignalSpy,
where it was 100% reproducible (I haven't check other tests for
reproducibility).
This above error is printed when VxWorks task starts and initializes its
pthread containers. Pthread starting procedure results in error
`S_objLib_OBJ_ID_ERROR`, on which documentation states that it means
"The <tid> parameter is an invalid task ID". This happens because
VxWorks pthread implementation clears its internal data, and only then
passes control to `taskExit` system procedure, which calls thread_local
destructors. Any calls to `pthread` routines which require current
thread internal data ends with error and termination.
While VxWorks uses clang internally, it implements `__cxa_thread_atexit`
and `__cxa_thread_atexit_impl`, which makes it pass `TEST_cxa_atexit` in
CMake, even thou their call order is different than on other platforms.
Enable QT_FEATURE_broken_threadlocal_dtors for VxWorks by failing
compilation of cxa_thread_atexit* tests, which fixes the crashes on
VxWorks.
Task-number: QTBUG-115777
Change-Id: I4109b66903333a94301afe7fe5634ac4365a70b4
Reviewed-by: Thiago Macieira <[email protected]>
-rw-r--r-- | config.tests/cxa_thread_atexit/main.c | 13 | ||||
-rw-r--r-- | src/corelib/configure.cmake | 2 |
2 files changed, 14 insertions, 1 deletions
diff --git a/config.tests/cxa_thread_atexit/main.c b/config.tests/cxa_thread_atexit/main.c index 19eef494392..297e3939a5f 100644 --- a/config.tests/cxa_thread_atexit/main.c +++ b/config.tests/cxa_thread_atexit/main.c @@ -2,6 +2,19 @@ // SPDX-License-Identifier: BSD-3-Clause #include <stddef.h> +#if defined(__vxworks) || defined(__VXWORKS__) +/* + * In VxWorks pthread implementation, when thread is finishing it calls pthread_exit(), which: + * - calls pthread cleanup procedure + * - clears pthread data (setting current thread to null) + * - calls `taskExit` VxWorks system procedure + * `taskExit` procedure calls thread_local object destructors, which if call directly or indirectly + * `pthread_self()`, terminate with error, due to not being able to obtain pthread entity. + * Thus, we need to treat VxWorks pthread implementation as `broken` in terms of thread_local variables. + */ +# error "VxWorks threadlocal destructors are called after pthread data is destroyed, causing crash." +#endif + typedef void (*dtor_func) (void *); int TEST_FUNC(dtor_func func, void *obj, void *dso_symbol); int main() diff --git a/src/corelib/configure.cmake b/src/corelib/configure.cmake index de42a8c03ee..71812527917 100644 --- a/src/corelib/configure.cmake +++ b/src/corelib/configure.cmake @@ -615,7 +615,7 @@ qt_feature("cxx17_filesystem" PUBLIC ) qt_feature("broken-threadlocal-dtors" PRIVATE LABEL "Broken execution of thread_local destructors at exit() time" - # Windows broken in different ways from Unix + # Windows is broken in different ways from Unix CONDITION WIN32 OR NOT (TEST_cxa_thread_atexit OR TEST_cxa_thread_atexit_impl) ) qt_feature("dladdr" PRIVATE |