]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
hurd: Fix getting signal thread stack layout for fork
authorSamuel Thibault <samuel.thibault@ens-lyon.org>
Sat, 17 Mar 2018 21:50:09 +0000 (22:50 +0100)
committerSamuel Thibault <samuel.thibault@ens-lyon.org>
Sat, 17 Mar 2018 21:53:01 +0000 (22:53 +0100)
* hurd/hurdsig.c: Include <pthread.h>.
(_hurdsig_init): Call pthread_getattr_np and pthread_attr_getstack to
get the signal thread stack layout.

ChangeLog
hurd/hurdsig.c

index 175bcafe669724b7a01b7c7b26d566b53ba32e8a..7f4721b06e2c053c3006f623979742b18a4259d0 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2018-03-17  Samuel Thibault  <samuel.thibault@ens-lyon.org>
+
+       * hurd/hurdsig.c: Include <pthread.h>.
+       (_hurdsig_init): Call pthread_getattr_np and pthread_attr_getstack to
+       get the signal thread stack layout.
+
 2018-03-16  Samuel Thibault  <samuel.thibault@ens-lyon.org>
 
        * sysdeps/generic/thread_state.h (MACHINE_NEW_THREAD_STATE_FLAVOR):
index 4f5bb9a8da3b648fcfdeeaab6855e10023f9b936..198546fbb33adc739a39148aa76e70a035a5f735 100644 (file)
@@ -20,6 +20,7 @@
 #include <string.h>
 
 #include <cthreads.h>          /* For `struct mutex'.  */
+#include <pthread.h>
 #include <mach.h>
 #include <mach/thread_switch.h>
 
@@ -1297,7 +1298,24 @@ _hurdsig_init (const int *intarray, size_t intarraysize)
          values all zero so they'll be ignored.  */
 #pragma weak cthread_fork
 #pragma weak cthread_detach
-      cthread_detach (cthread_fork ((cthread_fn_t) &_hurd_msgport_receive, 0));
+#pragma weak pthread_getattr_np
+#pragma weak pthread_attr_getstack
+      cthread_t thread = cthread_fork ((cthread_fn_t) &_hurd_msgport_receive,
+                                      0);
+      cthread_detach (thread);
+
+      if (pthread_getattr_np)
+       {
+         /* Record signal thread stack layout for fork() */
+         pthread_attr_t attr;
+         void *addr;
+         size_t size;
+
+         pthread_getattr_np ((pthread_t) thread, &attr);
+         pthread_attr_getstack (&attr, &addr, &size);
+         __hurd_sigthread_stack_base = (uintptr_t) addr;
+         __hurd_sigthread_stack_end = __hurd_sigthread_stack_base + size;
+       }
 
       /* XXX We need the thread port for the signal thread further on
          in this thread (see hurdfault.c:_hurdsigfault_init).