diff options
Diffstat (limited to 'hurd/hurdsig.c')
-rw-r--r-- | hurd/hurdsig.c | 41 |
1 files changed, 26 insertions, 15 deletions
diff --git a/hurd/hurdsig.c b/hurd/hurdsig.c index caf97cfd77..aa82f63413 100644 --- a/hurd/hurdsig.c +++ b/hurd/hurdsig.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1991-2016 Free Software Foundation, Inc. +/* Copyright (C) 1991-2018 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -20,9 +20,10 @@ #include <string.h> #include <cthreads.h> /* For `struct mutex'. */ -#include <pthread.h> +#include <pthreadP.h> #include <mach.h> #include <mach/thread_switch.h> +#include <mach/mig_support.h> #include <hurd.h> #include <hurd/id.h> @@ -32,6 +33,8 @@ #include "hurdmalloc.h" /* XXX */ #include "../locale/localeinfo.h" +#include <libc-diag.h> + const char *_hurdsig_getenv (const char *); struct mutex _hurd_siglock; @@ -120,6 +123,7 @@ _hurd_thread_sigstate (thread_t thread) __mutex_unlock (&_hurd_siglock); return ss; } +libc_hidden_def (_hurd_thread_sigstate) /* Signal delivery itself is on this page. */ @@ -244,8 +248,14 @@ interrupted_reply_port_location (thread_t thread, /* Faulted trying to read the TCB. */ return NULL; + DIAG_PUSH_NEEDS_COMMENT; + /* GCC 6 and before seem to be confused by the setjmp call inside + _hurdsig_catch_memory_fault and think that we may be returning a second + time to here with portloc uninitialized (but we never do). */ + DIAG_IGNORE_NEEDS_COMMENT (6, "-Wmaybe-uninitialized"); /* Fault now if this pointer is bogus. */ *(volatile mach_port_t *) portloc = *portloc; + DIAG_POP_NEEDS_COMMENT; if (sigthread) _hurdsig_end_catch_fault (); @@ -1018,7 +1028,7 @@ _hurd_internal_post_signal (struct hurd_sigstate *ss, || ss->actions[signo].sa_handler == SIG_IGN || ss->actions[signo].sa_handler == SIG_DFL)) { - mutex_unlock (&_hurd_siglock); + __mutex_unlock (&_hurd_siglock); goto deliver_pending; } __spin_unlock (&ss->lock); @@ -1258,11 +1268,8 @@ _hurdsig_init (const int *intarray, size_t intarraysize) /* Start the signal thread listening on the message port. */ -#pragma weak cthread_fork -#pragma weak cthread_detach -#pragma weak pthread_getattr_np -#pragma weak pthread_attr_getstack - if (!cthread_fork) +#pragma weak __cthread_fork + if (!__cthread_fork) { err = __thread_create (__mach_task_self (), &_hurd_msgport_thread); assert_perror (err); @@ -1287,7 +1294,6 @@ _hurdsig_init (const int *intarray, size_t intarraysize) } else { - cthread_t thread; /* When cthreads is being used, we need to make the signal thread a proper cthread. Otherwise it cannot use mutex_lock et al, which will be the cthreads versions. Various of the message port RPC @@ -1297,17 +1303,22 @@ _hurdsig_init (const int *intarray, size_t intarraysize) we'll let the signal thread's per-thread variables be found as for any normal cthread, and just leave the magic __hurd_sigthread_* values all zero so they'll be ignored. */ - cthread_detach (thread = cthread_fork ((cthread_fn_t) &_hurd_msgport_receive, 0)); - - if (pthread_getattr_np) +#pragma weak __cthread_detach +#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 stack layout for fork() */ + /* 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); + __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; } |