Update.
authorUlrich Drepper <drepper@redhat.com>
Thu, 28 Sep 2000 23:11:33 +0000 (23:11 +0000)
committerUlrich Drepper <drepper@redhat.com>
Thu, 28 Sep 2000 23:11:33 +0000 (23:11 +0000)
* mutex.c (__pthread_mutex_unlock): For PTHREAD_MUTEX_RECURSIVE_NP
test for owner first.
Patch by Kaz Kylheku <kaz@ashi.footprints.net>.

18 files changed:
elf/soinit.c
linuxthreads/ChangeLog
linuxthreads/mutex.c
manual/errno.texi
math/Makefile
math/test-fenv.c
string/bits/string2.h
sysdeps/generic/gccframe.h [new file with mode: 0644]
sysdeps/gnu/errlist.c
sysdeps/ia64/bits/fenv.h
sysdeps/ia64/fpu/fclrexcpt.c
sysdeps/ia64/fpu/fedisblxcpt.c
sysdeps/ia64/fpu/feenablxcpt.c
sysdeps/ia64/fpu/fesetenv.c
sysdeps/ia64/fpu/fesetround.c
sysdeps/ia64/fpu/fgetexcptflg.c
sysdeps/ia64/fpu/fsetexcptflg.c
sysdeps/ia64/gccframe.h [new file with mode: 0644]

index 3cb5584..4e2a149 100644 (file)
@@ -3,6 +3,10 @@
    the `.ctors' and `.dtors' sections so the lists are terminated, and
    calling those lists of functions.  */
 
+# ifdef HAVE_DWARF2_UNWIND_INFO_STATIC
+# include <gccframe.h>
+# endif
+
 static void (*const __CTOR_LIST__[1]) (void)
      __attribute__ ((section (".ctors")))
      = { (void (*) (void)) -1 };
@@ -22,16 +26,6 @@ static char __EH_FRAME_BEGIN__[]
      __attribute__ ((section (".eh_frame")))
      = { };
 # ifdef HAVE_DWARF2_UNWIND_INFO_STATIC
-/* This must match what's in frame.h in gcc. How can one do that? */
-struct object
-{
-  void *pc_begin;
-  void *pc_end;
-  void *fde_begin;
-  void *fde_array;
-  __SIZE_TYPE__ count;
-  struct object *next;
-};
 extern void __register_frame_info (const void *, struct object *);
 extern void __deregister_frame_info (const void *);
 # else
index 9045828..4c281da 100644 (file)
@@ -1,5 +1,9 @@
 2000-09-28  Ulrich Drepper  <drepper@redhat.com>
 
+       * mutex.c (__pthread_mutex_unlock): For PTHREAD_MUTEX_RECURSIVE_NP
+       test for owner first.
+       Patch by Kaz Kylheku <kaz@ashi.footprints.net>.
+
        * cancel.c (pthread_cancel): Don't do anything if cancelation is
        disabled.
 
index 9ce4a30..9b4a3c7 100644 (file)
@@ -163,6 +163,8 @@ int __pthread_mutex_unlock(pthread_mutex_t * mutex)
     __pthread_unlock(&mutex->__m_lock);
     return 0;
   case PTHREAD_MUTEX_RECURSIVE_NP:
+    if (mutex->__m_owner != thread_self())
+      return EPERM;
     if (mutex->__m_count > 0) {
       mutex->__m_count--;
       return 0;
index 8b18c83..5abb823 100644 (file)
@@ -162,7 +162,7 @@ Input/output error; usually used for physical read or write errors.
 @end deftypevr
 
 @comment errno.h
-@comment POSIX.1: Device not configured
+@comment POSIX.1: No such device or address
 @deftypevr Macro int ENXIO
 @comment errno 6 @c DO NOT REMOVE
 No such device or address.  The system tried to use the device
index 45df416..2e24019 100644 (file)
@@ -83,6 +83,7 @@ tests = test-matherr test-fenv atest-exp atest-sincos atest-exp2 basic-test \
 # We do the `long double' tests only if this data type is available and
 # distinct from `double'.
 test-longdouble-yes = test-ldouble test-ildoubl
+distribute += $(test-longdouble-yes:=.c)
 
 ifneq (no,$(PERL))
 libm-tests = test-float test-double $(test-longdouble-$(long-double-fcts)) \
index d803f27..c369fc0 100644 (file)
@@ -400,6 +400,7 @@ static void
 feexcp_mask_test (const char *flag_name, int fe_exc)
 {
   int status;
+  int exception;
   pid_t pid;
 
   printf ("Test: after fedisable (%s) processes will not abort\n", flag_name);
@@ -415,7 +416,22 @@ feexcp_mask_test (const char *flag_name, int fe_exc)
       setrlimit (RLIMIT_CORE, &core_limit);
 #endif
       feenableexcept (FE_ALL_EXCEPT);
-      fedisableexcept (fe_exc);
+      exception = fe_exc;
+#ifdef FE_INEXACT
+      /* The standard allows the inexact exception to be set together with the
+        underflow and overflow exceptions.  So add FE_INEXACT to the set of
+        exceptions to be disabled if we will be raising underflow or
+        overflow.  */
+# ifdef FE_OVERFLOW
+      if (fe_exc & FE_OVERFLOW)
+       exception |= FE_INEXACT;
+# endif
+# ifdef FE_UNDERFLOW
+      if (fe_exc & FE_UNDERFLOW)
+       exception |= FE_INEXACT;
+# endif
+#endif
+      fedisableexcept (exception);
       feraiseexcept (fe_exc);
       exit (2);
     }
index 897b5d5..de427f8 100644 (file)
@@ -22,7 +22,7 @@
 # error "Never use <bits/string2.h> directly; include <string.h> instead."
 #endif
 
-#if !defined __NO_STRING_INLINES && !__BOUNDED_POINTERS__
+#if !defined __NO_STRING_INLINES && !defined __BOUNDED_POINTERS__
 
 /* Unlike the definitions in the header <bits/string.h> the
    definitions contained here are not optimized down to assembler
diff --git a/sysdeps/generic/gccframe.h b/sysdeps/generic/gccframe.h
new file mode 100644 (file)
index 0000000..6ed9320
--- /dev/null
@@ -0,0 +1,30 @@
+/* Definition of object in frame unwind info.  Generic version.
+   Copyright (C) 2000 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., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+/* This must match what's in frame.h in gcc. */
+
+struct object
+{
+  void *pc_begin;
+  void *pc_end;
+  void *fde_begin;
+  void *fde_array;
+  __SIZE_TYPE__ count;
+  struct object *next;
+};
index 4c635d2..1b15c5e 100644 (file)
@@ -59,7 +59,7 @@ TRANS represented by a file you specified, and it couldn't find the device.
 TRANS This can mean that the device file was installed incorrectly, or that
 TRANS the physical device is missing or not correctly attached to the
 TRANS computer. */
-    [ERR_REMAP (ENXIO)] = N_("Device not configured"),
+    [ERR_REMAP (ENXIO)] = N_("No such device or address"),
 #endif
 #ifdef E2BIG
 /*
index 9c3bd47..783fc9b 100644 (file)
@@ -67,10 +67,10 @@ enum
 
 
 /* Type representing exception flags.  */
-typedef unsigned long fexcept_t;
+typedef unsigned long int fexcept_t;
 
 /* Type representing floating-point environment.  */
-typedef unsigned long fenv_t;
+typedef unsigned long int fenv_t;
 
 /* If the default argument is used we use this value.  */
 #define FE_DFL_ENV     ((__const fenv_t *) 0xc009804c0270033fUL)
index fbd93ce..40ba179 100644 (file)
@@ -30,7 +30,7 @@ feclearexcept (int excepts)
   __asm__ __volatile__ ("mov.m %0=ar.fpsr" : "=r" (fpsr));
 
   /* Clear the relevant bits.  */
-  fpsr &= ~(((unsigned long int) ((excepts & FE_ALL_EXCEPT) << 13)));
+  fpsr &= ~(((fenv_t) ((excepts & FE_ALL_EXCEPT) << 13)));
   /* Put the new state in effect.  */
   __asm__ __volatile__ ("mov.m ar.fpsr=%0" :: "r" (fpsr) : "memory");
 
index fceedc2..1006e03 100644 (file)
@@ -29,7 +29,7 @@ fedisableexcept (int excepts)
   /* Get the current fpsr.  */
   __asm__ __volatile__ ("mov.m %0=ar.fpsr" : "=r" (old_fpsr));
 
-  new_fpsr = old_fpsr |= FE_ALL_EXCEPT;
+  new_fpsr = old_fpsr | ((fenv_t) excepts & FE_ALL_EXCEPT);
 
   __asm__ __volatile__ ("mov.m ar.fpsr=%0" :: "r" (new_fpsr) : "memory");
 
index 2c54476..686b750 100644 (file)
@@ -29,8 +29,7 @@ feenableexcept (int excepts)
   /* Get the current fpsr.  */
   __asm__ __volatile__ ("mov.m %0=ar.fpsr" : "=r " (old_fpsr));
 
-  new_fpsr = ((old_fpsr & FE_ALL_EXCEPT)
-             | (old_fpsr & ((unsigned long int) excepts ^ FE_ALL_EXCEPT)));
+  new_fpsr = old_fpsr & ~((fenv_t) excepts & FE_ALL_EXCEPT);
 
   __asm__ __volatile__ ("mov.m ar.fpsr=%0" :: "r" (new_fpsr) : "memory");
 
index b1209ca..79651ea 100644 (file)
@@ -30,8 +30,8 @@ fesetenv (const fenv_t *envp)
      Magic encoding of default values: bit 62+63 set (which will never
      happen for a user-space address) means it's not indirect.
   */
-  if (((unsigned long int) envp >> 62) == 0x03)
-    env = (unsigned long int) envp & 0x3fffffffffffffff;
+  if (((fenv_t) envp >> 62) == 0x03)
+    env = (fenv_t) envp & 0x3fffffffffffffff;
   else
     env = *envp;
 
index 66d7f89..7738eb2 100644 (file)
@@ -23,7 +23,7 @@
 int
 fesetround (int round)
 {
-  unsigned long int fpsr;
+  fenv_t fpsr;
 
   if (round & ~3)
     return 0;
@@ -32,7 +32,7 @@ fesetround (int round)
   __asm__ __volatile__ ("mov.m %0=ar.fpsr" : "=r" (fpsr));
 
   /* Set the relevant bits.  */
-  fpsr = (fpsr & ~(3UL << 10)) | ((unsigned long int) round << 10);
+  fpsr = (fpsr & ~(3UL << 10)) | ((fenv_t) round << 10);
 
   /* Put the new state in effect.  */
   __asm__ __volatile__ ("mov.m ar.fpsr=%0" :: "r" (fpsr) : "memory");
index 5555307..46a04e3 100644 (file)
@@ -28,7 +28,7 @@ fegetexceptflag (fexcept_t *flagp, int excepts)
   /* Get the current exceptions.  */
   __asm__ __volatile__ ("mov.m %0=ar.fpsr" : "=r" (fpsr));
 
-  *flagp = (fpsr ^ FE_ALL_EXCEPT) & excepts & FE_ALL_EXCEPT;
+  *flagp = (fexcept_t) ((fpsr >> 13) & excepts & FE_ALL_EXCEPT);
 
   /* Success.  */
   return 0;
index 5e04041..6964363 100644 (file)
@@ -19,7 +19,6 @@
    Boston, MA 02111-1307, USA.  */
 
 #include <fenv.h>
-#include <math.h>
 
 int
 fesetexceptflag (const fexcept_t *flagp, int excepts)
@@ -29,12 +28,10 @@ fesetexceptflag (const fexcept_t *flagp, int excepts)
   /* Get the current exception state.  */
   __asm__ __volatile__ ("mov.m %0=ar.fpsr" : "=r" (fpsr));
 
-  /* Get the reverse bits so we can enable the exceptions flagged
-     rather than disable them.  */
-  excepts ^= FE_ALL_EXCEPT;
+  fpsr &= ~(((fenv_t) excepts & FE_ALL_EXCEPT) << 13);
 
   /* Set all the bits that were called for.  */
-  fpsr = (fpsr & ~FE_ALL_EXCEPT) | (*flagp & excepts & FE_ALL_EXCEPT);
+  fpsr |= ((*flagp & excepts & FE_ALL_EXCEPT) << 13);
 
   /* And store it back.  */
   __asm__ __volatile__ ("mov.m ar.fpsr=%0" :: "r" (fpsr) : "memory");
diff --git a/sysdeps/ia64/gccframe.h b/sysdeps/ia64/gccframe.h
new file mode 100644 (file)
index 0000000..606bec6
--- /dev/null
@@ -0,0 +1,32 @@
+/* Definition of object in frame unwind info.  ia64 version.
+   Copyright (C) 2000 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., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+/* This must match what's in frame.h in gcc. */
+
+struct object
+{
+  void *pc_base;        /* This field will be set by find_fde. */
+  void *pc_begin;
+  void *pc_end;
+  void *fde_begin;
+  void *fde_end;
+  void *fde_array;
+  __SIZE_TYPE__ count;
+  struct object *next;
+};