diff options
author | Peter Seiderer <ps.report@gmx.net> | 2021-04-16 23:12:51 +0200 |
---|---|---|
committer | Waldemar Brodkorb <wbx@openadk.org> | 2021-04-18 17:19:13 +0200 |
commit | 12f6282b6bf59d45934c78118ad5d26039fb533b (patch) | |
tree | 7a0c192176f14794e3adcdf4e783b19434889e32 | |
parent | 221f2898b9140b4cc103d2c485061023706c1fcf (diff) |
libpthread/nptl: create timer thread with sufficiant stack size (account for TLS)
Create timer thread with sufficiant stack size (take into account
allocated space for thread-local-storage), for this backport glibc
commit 'Create internal threads with sufficient stack size' ([1],
[2]) introducing __pthread_get_minstack() and use it in
__start_helper_thread().
Fixes timer_create() in case of linking with library using large
TLS area (e.g openblas, see [3]).
[1] https://sourceware.org/git/?p=glibc.git;a=commitdiff;h=2c1094bd700e63a8d7f547b3f5495bedb55c0a08
[2] https://sourceware.org/git/?p=glibc.git;a=commitdiff;h=630f4cc3aa019ede55976ea561f1a7af2f068639
[3] http://lists.busybox.net/pipermail/buildroot/2021-April/308281.html
Signed-off-by: Peter Seiderer <ps.report@gmx.net>
-rw-r--r-- | libpthread/nptl/init.c | 6 | ||||
-rw-r--r-- | libpthread/nptl/pthreadP.h | 1 | ||||
-rw-r--r-- | libpthread/nptl/sysdeps/unix/sysv/linux/timer_routines.c | 2 |
3 files changed, 8 insertions, 1 deletions
diff --git a/libpthread/nptl/init.c b/libpthread/nptl/init.c index 4959d5ed8..5d25ded7d 100644 --- a/libpthread/nptl/init.c +++ b/libpthread/nptl/init.c @@ -337,3 +337,9 @@ __pthread_initialize_minimal_internal (void) } strong_alias (__pthread_initialize_minimal_internal, __pthread_initialize_minimal) + +size_t +__pthread_get_minstack (const pthread_attr_t *attr) +{ + return __static_tls_size + PTHREAD_STACK_MIN; +} diff --git a/libpthread/nptl/pthreadP.h b/libpthread/nptl/pthreadP.h index 13205512a..c686a4ca5 100644 --- a/libpthread/nptl/pthreadP.h +++ b/libpthread/nptl/pthreadP.h @@ -377,6 +377,7 @@ weak_function; extern void __pthread_init_static_tls (struct link_map *) attribute_hidden; +extern size_t __pthread_get_minstack (const pthread_attr_t *attr); /* Namespace save aliases. */ extern int __pthread_getschedparam (pthread_t thread_id, int *policy, diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/timer_routines.c b/libpthread/nptl/sysdeps/unix/sysv/linux/timer_routines.c index 514913317..60f2a724c 100644 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/timer_routines.c +++ b/libpthread/nptl/sysdeps/unix/sysv/linux/timer_routines.c @@ -164,7 +164,7 @@ __start_helper_thread (void) and should go away automatically when canceled. */ pthread_attr_t attr; (void) pthread_attr_init (&attr); - (void) pthread_attr_setstacksize (&attr, PTHREAD_STACK_MIN); + (void) pthread_attr_setstacksize (&attr, __pthread_get_minstack (&attr)); /* Block all signals in the helper thread but SIGSETXID. To do this thoroughly we temporarily have to block all signals here. The |