This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
[PATCH] Mark new threads as global signal receivers
- From: Jeremie Koenig <jk at jk dot fr dot eu dot org>
- To: bug-hurd at gnu dot org
- Cc: Jeremie Koenig <jk at jk dot fr dot eu dot org>,libc-alpha at sourceware dot org
- Date: Wed, 25 May 2011 18:01:29 +0200
- Subject: [PATCH] Mark new threads as global signal receivers
- References: <1306339289-30864-1-git-send-email-jk@jk.fr.eu.org>
* sysdeps/mach/hurd/pt-sigstate-init.c (__pthread_sigstate_init):
Call _hurd_sigstate_set_global_rcv for newly created threads.
Declare it as a weak symbol so that we stay compatible with previous
glibc versions.
---
sysdeps/mach/hurd/pt-sigstate-init.c | 20 +++++++++++++++++++-
1 files changed, 19 insertions(+), 1 deletions(-)
diff --git a/sysdeps/mach/hurd/pt-sigstate-init.c b/sysdeps/mach/hurd/pt-sigstate-init.c
index da5a945..811f7b3 100644
--- a/sysdeps/mach/hurd/pt-sigstate-init.c
+++ b/sysdeps/mach/hurd/pt-sigstate-init.c
@@ -19,9 +19,14 @@
#include <pthread.h>
#include <hurd/threadvar.h>
+#include <hurd/signal.h>
#include <pt-internal.h>
+/* Preserve compatibility with older glibc versions. */
+void _hurd_sigstate_set_global_rcv (struct hurd_sigstate *ss)
+ __attribute__((weak));
+
error_t
__pthread_sigstate_init (struct __pthread *thread)
{
@@ -30,8 +35,21 @@ __pthread_sigstate_init (struct __pthread *thread)
thread->stackaddr);
/* The real initialization happens internally in glibc the first
- time that _hurd_thead_sigstate is called. */
+ time that _hurd_self_sigstate is called. */
*location = 0;
+ /* Mark the thread as a global signal receiver so as to conform with
+ the pthread semantics. However, we must be careful. The first
+ pthread created is the main thread, during libpthread initialization.
+ We must not mark it, otherwise the sigprocmask call in
+ __pthread_create would try to access _hurd_global_sigstate,
+ which is not initialized yet. When glibc runs _hurdsig_init later
+ on, the message thread is created, which must not be marked either. */
+ if (_hurd_sigstate_set_global_rcv && __pthread_num_threads > 2)
+ {
+ struct hurd_sigstate *ss = _hurd_thread_sigstate (thread->kernel_thread);
+ _hurd_sigstate_set_global_rcv (ss);
+ }
+
return 0;
}
--
1.7.1