aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSamuel Thibault <samuel.thibault@ens-lyon.org>2018-03-17 22:50:09 +0100
committerSamuel Thibault <samuel.thibault@ens-lyon.org>2018-03-17 22:53:01 +0100
commit34e6a8694d9dd80558150f8542359b93c6c57e44 (patch)
tree19f621d3c8b1e4d553ed0d9701fa3b20c1a83fdb
parentf8baf2a2242029600beb213d3f042e7c0482e502 (diff)
downloadglibc-34e6a8694d9dd80558150f8542359b93c6c57e44.tar
glibc-34e6a8694d9dd80558150f8542359b93c6c57e44.tar.gz
glibc-34e6a8694d9dd80558150f8542359b93c6c57e44.tar.bz2
glibc-34e6a8694d9dd80558150f8542359b93c6c57e44.zip
hurd: Fix getting signal thread stack layout for fork
* hurd/hurdsig.c: Include <pthread.h>. (_hurdsig_init): Call pthread_getattr_np and pthread_attr_getstack to get the signal thread stack layout.
-rw-r--r--ChangeLog6
-rw-r--r--hurd/hurdsig.c20
2 files changed, 25 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index 175bcafe66..7f4721b06e 100644
--- 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):
diff --git a/hurd/hurdsig.c b/hurd/hurdsig.c
index 4f5bb9a8da..198546fbb3 100644
--- a/hurd/hurdsig.c
+++ b/hurd/hurdsig.c
@@ -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).