From ae2c09fbf84af8de99a19e55aeb63c40d40702c3 Mon Sep 17 00:00:00 2001 From: Samuel Thibault Date: Fri, 20 Sep 2019 20:39:03 +0100 Subject: [PATCH] Enable global signal distribution in htl * sysdeps/mach/hurd/htl/pt-sigstate-init.c (__pthread_sigstate_init): Call _hurd_sigstate_set_global_rcv(). * sysdeps/mach/hurd/htl/pt-sigstate-destroy.c (__pthread_sigstate_destroy): Call _hurd_sigstate_delete(). * sysdeps/mach/hurd/htl/pt-sigstate.c: Include (__pthread_sigstate): Use _hurd_sigstate_lock()/_hurd_sigstate_unlock() and _hurd_sigstate_pending(). Call __msg_sig_post() to wake up thread with pending signals. * sysdeps/mach/hurd/Makefile (LDLIBS-pthread.so): Add $(objdir)/hurd/libhurduser.so. Gbp-Pq: Topic hurd-i386 Gbp-Pq: Name libpthread_sigs.diff --- sysdeps/mach/hurd/Makefile | 2 ++ sysdeps/mach/hurd/htl/pt-sigstate-destroy.c | 1 + sysdeps/mach/hurd/htl/pt-sigstate-init.c | 2 +- sysdeps/mach/hurd/htl/pt-sigstate.c | 12 ++++++++++-- 4 files changed, 14 insertions(+), 3 deletions(-) diff --git a/sysdeps/mach/hurd/Makefile b/sysdeps/mach/hurd/Makefile index 477984a01..64348db23 100644 --- a/sysdeps/mach/hurd/Makefile +++ b/sysdeps/mach/hurd/Makefile @@ -211,4 +211,6 @@ ifeq ($(subdir),nis) CFLAGS-ypclnt.c += -DUSE_BINDINGDIR=1 endif +LDLIBS-pthread.so += $(objdir)/hurd/libhurduser.so + endif # in-Makerules diff --git a/sysdeps/mach/hurd/htl/pt-sigstate-destroy.c b/sysdeps/mach/hurd/htl/pt-sigstate-destroy.c index 13499c358..3c9147bc6 100644 --- a/sysdeps/mach/hurd/htl/pt-sigstate-destroy.c +++ b/sysdeps/mach/hurd/htl/pt-sigstate-destroy.c @@ -23,4 +23,5 @@ void __pthread_sigstate_destroy (struct __pthread *thread) { + _hurd_sigstate_delete (thread->kernel_thread); } diff --git a/sysdeps/mach/hurd/htl/pt-sigstate-init.c b/sysdeps/mach/hurd/htl/pt-sigstate-init.c index ecf3f71d1..c4fafae53 100644 --- a/sysdeps/mach/hurd/htl/pt-sigstate-init.c +++ b/sysdeps/mach/hurd/htl/pt-sigstate-init.c @@ -35,7 +35,7 @@ __pthread_sigstate_init (struct __pthread *thread) if (do_init_global) { struct hurd_sigstate *ss = _hurd_thread_sigstate (thread->kernel_thread); - (void) ss; + _hurd_sigstate_set_global_rcv (ss); } else if (__pthread_num_threads >= 2) do_init_global = 1; diff --git a/sysdeps/mach/hurd/htl/pt-sigstate.c b/sysdeps/mach/hurd/htl/pt-sigstate.c index 8408a4514..d5f6bc84c 100644 --- a/sysdeps/mach/hurd/htl/pt-sigstate.c +++ b/sysdeps/mach/hurd/htl/pt-sigstate.c @@ -20,6 +20,7 @@ #include #include #include +#include #include @@ -29,11 +30,12 @@ __pthread_sigstate (struct __pthread *thread, int how, { error_t err = 0; struct hurd_sigstate *ss; + sigset_t pending; ss = _hurd_thread_sigstate (thread->kernel_thread); assert (ss); - __spin_lock (&ss->lock); + _hurd_sigstate_lock (ss); if (oset != NULL) *oset = ss->blocked; @@ -64,7 +66,13 @@ __pthread_sigstate (struct __pthread *thread, int how, if (!err && clear_pending) __sigemptyset (&ss->pending); - __spin_unlock (&ss->lock); + pending = _hurd_sigstate_pending (ss) & ~ss->blocked; + _hurd_sigstate_unlock (ss); + + if (!err && pending) + /* Send a message to the signal thread so it + will wake up and check for pending signals. */ + __msg_sig_post (_hurd_msgport, 0, 0, __mach_task_self ()); return err; } -- 2.30.2