diff options
-rw-r--r-- | ChangeLog | 12 | ||||
-rw-r--r-- | hurd/hurdsig.c | 124 | ||||
-rw-r--r-- | manual/.cvsignore | 2 | ||||
-rw-r--r-- | sysdeps/mach/hurd/fpathconf.c | 38 | ||||
-rw-r--r-- | sysdeps/mach/hurd/pathconf.c | 41 |
5 files changed, 161 insertions, 56 deletions
diff --git a/ChangeLog b/ChangeLog index 91e0ea0e5e..e960cf8670 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,15 @@ +Fri May 26 13:00:08 1995 Roland McGrath <roland@churchy.gnu.ai.mit.edu> + + * hurd/hurdsig.c (_hurd_internal_post_signal): Don't loop to check + pending signals if the thread is in a critical section. It will + send us a msg when it finishes. + + * sysdeps/mach/hurd/pathconf.c: New file. + * sysdeps/mach/hurd/fpathconf.c: New file. + + * sysdeps/mach/hurd/sigaction.c: Only notify the proc server for + SIGCHLD when the SA_NOCLDSTOP bit actually changes. + Sun May 21 05:05:37 1995 Roland McGrath <roland@churchy.gnu.ai.mit.edu> * elf/Makefile (ld.so): Use -nostartfiles in addition to diff --git a/hurd/hurdsig.c b/hurd/hurdsig.c index c5ce050c7a..9414c059e3 100644 --- a/hurd/hurdsig.c +++ b/hurd/hurdsig.c @@ -847,64 +847,78 @@ _hurd_internal_post_signal (struct hurd_sigstate *ss, /* We get here unless the signal was fatal. We still hold SS->lock. Check for pending signals, and loop to post them. */ -#define PENDING (!_hurd_stopped && (pending = ss->pending & ~ss->blocked)) - if (PENDING) - { - pending: - for (signo = 1; signo < NSIG; ++signo) - if (__sigismember (&pending, signo)) + { + /* Return nonzero if SS has any signals pending we should worry about. + We don't worry about any pending signals if we are stopped, nor if + SS is in a critical section. We are guaranteed to get a sig_post + message before any of them become deliverable: either the SIGCONT + signal, or a sig_post with SIGNO==0 as an explicit poll when the + thread finishes its critical section. */ + inline int signals_pending (void) + { + if (_hurd_stopped || ss->critical_section) + return 0; + return pending = ss->pending & ~ss->blocked; + } + + if (signals_pending ()) + { + pending: + for (signo = 1; signo < NSIG; ++signo) + if (__sigismember (&pending, signo)) + { + __sigdelset (&ss->pending, signo); + sigcode = ss->pending_data[signo].code; + sigerror = ss->pending_data[signo].error; + __spin_unlock (&ss->lock); + goto post_signal; + } + } + + /* No pending signals left undelivered for this thread. + If we were sent signal 0, we need to check for pending + signals for all threads. */ + if (signo == 0) + { + __spin_unlock (&ss->lock); + __mutex_lock (&_hurd_siglock); + for (ss = _hurd_sigstates; ss != NULL; ss = ss->next) { - __sigdelset (&ss->pending, signo); - sigcode = ss->pending_data[signo].code; - sigerror = ss->pending_data[signo].error; + __spin_lock (&ss->lock); + if (signals_pending ()) + goto pending; __spin_unlock (&ss->lock); - goto post_signal; } - } - - /* No pending signals left undelivered for this thread. - If we were sent signal 0, we need to check for pending - signals for all threads. */ - if (signo == 0) - { - __spin_unlock (&ss->lock); - __mutex_lock (&_hurd_siglock); - for (ss = _hurd_sigstates; ss != NULL; ss = ss->next) - { - __spin_lock (&ss->lock); - if (PENDING) - goto pending; - __spin_unlock (&ss->lock); - } - __mutex_unlock (&_hurd_siglock); - } - else - { - /* No more signals pending; SS->lock is still locked. - Wake up any sigsuspend call that is blocking SS->thread. */ - if (ss->suspended != MACH_PORT_NULL) - { - /* There is a sigsuspend waiting. Tell it to wake up. */ - error_t err; - mach_msg_header_t msg; - err = __mach_port_insert_right (__mach_task_self (), - ss->suspended, ss->suspended, - MACH_MSG_TYPE_MAKE_SEND); - assert_perror (err); - msg.msgh_bits = MACH_MSGH_BITS (MACH_MSG_TYPE_MOVE_SEND, 0); - msg.msgh_remote_port = ss->suspended; - msg.msgh_local_port = MACH_PORT_NULL; - /* These values do not matter. */ - msg.msgh_id = 8675309; /* Jenny, Jenny. */ - msg.msgh_seqno = 17; /* Random. */ - ss->suspended = MACH_PORT_NULL; - err = __mach_msg (&msg, MACH_SEND_MSG, sizeof msg, 0, - MACH_PORT_NULL, MACH_MSG_TIMEOUT_NONE, - MACH_PORT_NULL); - assert_perror (err); - } - __spin_unlock (&ss->lock); - } + __mutex_unlock (&_hurd_siglock); + } + else + { + /* No more signals pending; SS->lock is still locked. + Wake up any sigsuspend call that is blocking SS->thread. */ + if (ss->suspended != MACH_PORT_NULL) + { + /* There is a sigsuspend waiting. Tell it to wake up. */ + error_t err; + mach_msg_header_t msg; + err = __mach_port_insert_right (__mach_task_self (), + ss->suspended, ss->suspended, + MACH_MSG_TYPE_MAKE_SEND); + assert_perror (err); + msg.msgh_bits = MACH_MSGH_BITS (MACH_MSG_TYPE_MOVE_SEND, 0); + msg.msgh_remote_port = ss->suspended; + msg.msgh_local_port = MACH_PORT_NULL; + /* These values do not matter. */ + msg.msgh_id = 8675309; /* Jenny, Jenny. */ + msg.msgh_seqno = 17; /* Random. */ + ss->suspended = MACH_PORT_NULL; + err = __mach_msg (&msg, MACH_SEND_MSG, sizeof msg, 0, + MACH_PORT_NULL, MACH_MSG_TIMEOUT_NONE, + MACH_PORT_NULL); + assert_perror (err); + } + __spin_unlock (&ss->lock); + } + } /* All pending signals delivered to all threads. Now we can send the reply message even for signal 0. */ diff --git a/manual/.cvsignore b/manual/.cvsignore index 2f3faf7c79..9429e1200d 100644 --- a/manual/.cvsignore +++ b/manual/.cvsignore @@ -3,7 +3,7 @@ TODO COPYING* AUTHORS copyr-* copying.* glibc-* -*.dvi* *.info* *.c.texi +*.dvi* *.info* *.c.texi *.ps *.toc *.aux *.log *.cp *.cps *.fn *.fns *.vr *.vrs *.tp *.tps *.ky *.kys *.pg *.pgs diff --git a/sysdeps/mach/hurd/fpathconf.c b/sysdeps/mach/hurd/fpathconf.c new file mode 100644 index 0000000000..1899062741 --- /dev/null +++ b/sysdeps/mach/hurd/fpathconf.c @@ -0,0 +1,38 @@ +/* Copyright (C) 1991, 1992, 1994, 1995 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 +modify it under the terms of the GNU Library General Public License as +published by the Free Software Foundation; either version 2 of the +License, or (at your option) any later version. + +The GNU C Library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +Library General Public License for more details. + +You should have received a copy of the GNU Library General Public +License along with the GNU C Library; see the file COPYING.LIB. If +not, write to the Free Software Foundation, Inc., 675 Mass Ave, +Cambridge, MA 02139, USA. */ + +#include <errno.h> +#include <stddef.h> +#include <sys/stat.h> +#include <hurd.h> +#include <hurd/fd.h> + +/* Get file-specific information about descriptor FD. */ +long int +__fpathconf (int fd, int name) +{ + error_t err; + long int value; + + if (err = HURD_DPORT_USE (fd, __file_pathconf (port, name, &value))) + return __hurd_dfail (fd, err), -1L; + + return value; +} + +weak_alias (__fpathconf, fpathconf) diff --git a/sysdeps/mach/hurd/pathconf.c b/sysdeps/mach/hurd/pathconf.c new file mode 100644 index 0000000000..315ab1f97e --- /dev/null +++ b/sysdeps/mach/hurd/pathconf.c @@ -0,0 +1,41 @@ +/* Copyright (C) 1991, 1992, 1994, 1995 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 +modify it under the terms of the GNU Library General Public License as +published by the Free Software Foundation; either version 2 of the +License, or (at your option) any later version. + +The GNU C Library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +Library General Public License for more details. + +You should have received a copy of the GNU Library General Public +License along with the GNU C Library; see the file COPYING.LIB. If +not, write to the Free Software Foundation, Inc., 675 Mass Ave, +Cambridge, MA 02139, USA. */ + +#include <errno.h> +#include <stddef.h> +#include <sys/stat.h> +#include <hurd.h> +#include <hurd/fd.h> + +/* Get file-specific information about FILE. */ +long int +__pathconf (const char *file, int name) +{ + error_t err; + file_t port = __file_name_lookup (file, 0, 0); + long int value; + if (port == MACH_PORT_NULL) + return -1L; + err = __file_pathconf (port, name, &value); + __mach_port_deallocate (__mach_task_self (), port); + if (err) + return __hurd_fail (err), -1L; + return value; +} + +weak_alias (__pathconf, pathconf) |