]> sourceware.org Git - glibc.git/commitdiff
Fri May 26 13:00:08 1995 Roland McGrath <roland@churchy.gnu.ai.mit.edu>
authorRoland McGrath <roland@gnu.org>
Sat, 27 May 1995 07:18:52 +0000 (07:18 +0000)
committerRoland McGrath <roland@gnu.org>
Sat, 27 May 1995 07:18:52 +0000 (07:18 +0000)
* 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.

ChangeLog
hurd/hurdsig.c
manual/.cvsignore
sysdeps/mach/hurd/fpathconf.c [new file with mode: 0644]
sysdeps/mach/hurd/pathconf.c [new file with mode: 0644]

index 91e0ea0e5e771274473cd34d849d1077b6c3cf21..e960cf8670e4c5ecd0112180fc5b5a793a9a2e81 100644 (file)
--- 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
index c5ce050c7a7c0ec14c9866c3e7b2c4af2b97b3f7..9414c059e351ecdfef79c39e71f21e31152d13f2 100644 (file)
@@ -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.  */
index 2f3faf7c799175786ed42502fcdf5135b1d7716c..9429e1200d1c9dad00e2e55af093b383cd16aaa3 100644 (file)
@@ -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 (file)
index 0000000..1899062
--- /dev/null
@@ -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 (file)
index 0000000..315ab1f
--- /dev/null
@@ -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)
This page took 0.05526 seconds and 5 git commands to generate.