summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoland McGrath <roland@gnu.org>1995-05-27 07:18:52 +0000
committerRoland McGrath <roland@gnu.org>1995-05-27 07:18:52 +0000
commit7cc645ed273e2f584a37657c488d6bfbcc33e0f3 (patch)
tree1489d577268ce71e764ff7d680cb9c5d7f112c6e
parent074d099ee3d24bff029fc2d1b7162eb9000fbd68 (diff)
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.
-rw-r--r--ChangeLog12
-rw-r--r--hurd/hurdsig.c124
-rw-r--r--manual/.cvsignore2
-rw-r--r--sysdeps/mach/hurd/fpathconf.c38
-rw-r--r--sysdeps/mach/hurd/pathconf.c41
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)