diff options
author | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2018-03-17 22:50:09 +0100 |
---|---|---|
committer | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2018-03-17 22:53:01 +0100 |
commit | 34e6a8694d9dd80558150f8542359b93c6c57e44 (patch) | |
tree | 19f621d3c8b1e4d553ed0d9701fa3b20c1a83fdb | |
parent | f8baf2a2242029600beb213d3f042e7c0482e502 (diff) | |
download | glibc-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-- | ChangeLog | 6 | ||||
-rw-r--r-- | hurd/hurdsig.c | 20 |
2 files changed, 25 insertions, 1 deletions
@@ -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). |