Browse Source

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>
Peter Seiderer 3 years ago
parent
commit
12f6282b6b

+ 6 - 0
libpthread/nptl/init.c

@@ -337,3 +337,9 @@ __pthread_initialize_minimal_internal (void)
 }
 }
 strong_alias (__pthread_initialize_minimal_internal,
 strong_alias (__pthread_initialize_minimal_internal,
 	      __pthread_initialize_minimal)
 	      __pthread_initialize_minimal)
+
+size_t
+__pthread_get_minstack (const pthread_attr_t *attr)
+{
+  return __static_tls_size + PTHREAD_STACK_MIN;
+}

+ 1 - 0
libpthread/nptl/pthreadP.h

@@ -377,6 +377,7 @@ weak_function;
 
 
 extern void __pthread_init_static_tls (struct link_map *) attribute_hidden;
 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.  */
 /* Namespace save aliases.  */
 extern int __pthread_getschedparam (pthread_t thread_id, int *policy,
 extern int __pthread_getschedparam (pthread_t thread_id, int *policy,

+ 1 - 1
libpthread/nptl/sysdeps/unix/sysv/linux/timer_routines.c

@@ -164,7 +164,7 @@ __start_helper_thread (void)
      and should go away automatically when canceled.  */
      and should go away automatically when canceled.  */
   pthread_attr_t attr;
   pthread_attr_t attr;
   (void) pthread_attr_init (&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
   /* Block all signals in the helper thread but SIGSETXID.  To do this
      thoroughly we temporarily have to block all signals here.  The
      thoroughly we temporarily have to block all signals here.  The