about summary refs log tree commit diff
path: root/sysdeps/mach/hurd/jmp-unwind.c
diff options
context:
space:
mode:
authorRoland McGrath <roland@gnu.org>1996-01-02 08:57:42 +0000
committerRoland McGrath <roland@gnu.org>1996-01-02 08:57:42 +0000
commit71733723fb421bd54467d1a27096463ed1dcc2ed (patch)
treef304556d491722c797d876911834dc4afbfa2740 /sysdeps/mach/hurd/jmp-unwind.c
parentfc4026d8e43407ba2739e493878d1ce259500059 (diff)
downloadglibc-71733723fb421bd54467d1a27096463ed1dcc2ed.tar.gz
glibc-71733723fb421bd54467d1a27096463ed1dcc2ed.tar.xz
glibc-71733723fb421bd54467d1a27096463ed1dcc2ed.zip
* hurd/hurd/signal.h (struct hurd_sigstate): New member `preempters'. cvs/libc-960102
	(hurd_preempt_signals, hurd_unpreempt_signals): Decls removed.
	* hurd/hurd/sigpreempt.h: New file.
	* hurd/preempt-sig.c: Rewritten with new interface.
	* sysdeps/mach/hurd/jmp-unwind.c (_longjmp_unwind): Remove local signal
	preempters being unwound past.

	* db: New directory, 4.4 BSD db package incorporated from BSD db-1.85
	release.

	* sysdeps/unix/sysv/linux/sys/param.h: Several new macros for BSD
	compatibility.
Diffstat (limited to 'sysdeps/mach/hurd/jmp-unwind.c')
-rw-r--r--sysdeps/mach/hurd/jmp-unwind.c18
1 files changed, 13 insertions, 5 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);
-}    
+}