From 71733723fb421bd54467d1a27096463ed1dcc2ed Mon Sep 17 00:00:00 2001 From: Roland McGrath Date: Tue, 2 Jan 1996 08:57:42 +0000 Subject: * hurd/hurd/signal.h (struct hurd_sigstate): New member `preempters'. (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. --- sysdeps/mach/hurd/jmp-unwind.c | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) (limited to 'sysdeps/mach') 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 #include + +#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); -} +} -- cgit v1.2.3