summary refs log tree commit diff
path: root/sysdeps
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps')
-rw-r--r--sysdeps/mach/hurd/jmp-unwind.c18
-rw-r--r--sysdeps/unix/sysv/linux/sys/param.h40
2 files changed, 42 insertions, 16 deletions
diff --git a/sysdeps/mach/hurd/jmp-unwind.c b/sysdeps/mach/hurd/jmp-unwind.c
index f7540f0dde..822501f8e5 100644
--- a/sysdeps/mach/hurd/jmp-unwind.c
+++ b/sysdeps/mach/hurd/jmp-unwind.c
@@ -22,6 +22,11 @@ Cambridge, MA 02139, USA.  */
 #include <hurd/userlink.h>
 #include <assert.h>
 
+
+#ifndef _JMPBUF_UNWINDS
+ #error "sysdeps/MACHINE/jmp_buf.h fails to define _JMPBUF_UNWINDS"
+#endif
+
 /* This function is called by `longjmp' (with its arguments) to restore
    active resources to a sane state before the frames code using them are
    jumped out of.  */
@@ -31,17 +36,20 @@ _longjmp_unwind (jmp_buf env, int val)
 {
   struct hurd_sigstate *ss = _hurd_self_sigstate ();
   struct hurd_userlink *link;
+  struct hurd_signal_preempter **p;
 
   /* All access to SS->active_resources must take place inside a critical
      section where signal handlers cannot run.  */
   __spin_lock (&ss->lock);
   assert (! ss->critical_section);
   ss->critical_section = 1;
-  __spin_unlock (&ss->lock);
 
-#ifndef _JMPBUF_UNWINDS
- #error "sysdeps/MACHINE/jmp_buf.h fails to define _JMPBUF_UNWINDS"
-#endif
+  /* Remove local signal preempters being unwound past.  */
+  while (ss->preempters &&
+	 _JMPBUF_UNWINDS (env[0].__jmpbuf, ss->preempters))
+    ss->preempters = ss->preempters->next;
+
+  __spin_unlock (&ss->lock);
 
   /* Iterate over the current thread's list of active resources.
      Process the head portion of the list whose links reside
@@ -59,4 +67,4 @@ _longjmp_unwind (jmp_buf env, int val)
       (*link->cleanup) (link->cleanup_data, env, val);
 
   _hurd_critical_section_unlock (ss);
-}    
+}
diff --git a/sysdeps/unix/sysv/linux/sys/param.h b/sysdeps/unix/sysv/linux/sys/param.h
index a2d4984166..4950d58d38 100644
--- a/sysdeps/unix/sysv/linux/sys/param.h
+++ b/sysdeps/unix/sysv/linux/sys/param.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 1995 Free Software Foundation, Inc.
+/* Copyright (C) 1995, 1996 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
@@ -23,23 +23,41 @@ Boston, MA 02111-1307, USA.  */
 #include <linux/limits.h>
 #include <linux/param.h>
 
+/* BSD names for some <limits.h> values.  */
+
+#define	NBBY		CHAR_BIT
+#ifndef	NGROUPS
+#define	NGROUPS		NGROUPS_MAX
+#endif
+#define	MAXSYMLINKS	SYMLOOP_MAX
+#define	CANBSIZ		MAX_CANON
+#define	NCARGS		ARG_MAX
+#define MAXPATHLEN      PATH_MAX
+#define NOFILE          OPEN_MAX
+
+
 #include <sys/types.h>
 
+/* Bit map related macros.  */
+#define	setbit(a,i)	((a)[(i)/NBBY] |= 1<<((i)%NBBY))
+#define	clrbit(a,i)	((a)[(i)/NBBY] &= ~(1<<((i)%NBBY)))
+#define	isset(a,i)	((a)[(i)/NBBY] & (1<<((i)%NBBY)))
+#define	isclr(a,i)	(((a)[(i)/NBBY] & (1<<((i)%NBBY))) == 0)
 
+/* Macros for counting and rounding.  */
 #ifndef howmany
-# define howmany(x, y)	(((x)+((y)-1))/(y))
+#define	howmany(x, y)	(((x)+((y)-1))/(y))
 #endif
+#define	roundup(x, y)	((((x)+((y)-1))/(y))*(y))
+#define powerof2(x)	((((x)-1)&(x))==0)
 
-#ifndef roundup
-# define roundup(x, y)	((((x)+((y)-1))/(y))*(y))
-#endif
+/* Macros for min/max.  */
+#define	MIN(a,b) (((a)<(b))?(a):(b))
+#define	MAX(a,b) (((a)>(b))?(a):(b))
 
-#define MAXPATHLEN      PATH_MAX
-#define NOFILE          OPEN_MAX
 
-/*  Following the information of some of the kernel people I here assume
-    that block size (i.e. the value of stat.st_blocks) for all filesystem
-    is 512 bytes.  If not tell HJ, Roland, or me.  -- drepper */
+/* Unit of `st_blocks'.  */
 #define DEV_BSIZE       512
 
-#endif
+
+#endif	/* sys/param.h */