From 968d91b2e6156e84c9fa5a6534364861446549f8 Mon Sep 17 00:00:00 2001 From: Christopher Faylor Date: Wed, 25 Apr 2001 19:11:37 +0000 Subject: [PATCH] * sigproc.h [sigthread]: Add exception field. [sigframe::~sigframe]: Clear exception field. [sigframe::set]: Set exception field from caller. * sigproc.cc (sig_send): Set exception field when frame pointer is passed in. * exceptions.cc (interrupt_on_return): Always treat exception as interruptible. --- winsup/cygwin/ChangeLog | 10 ++++++++++ winsup/cygwin/exceptions.cc | 2 +- winsup/cygwin/sigproc.cc | 2 +- winsup/cygwin/sigproc.h | 5 ++++- 4 files changed, 16 insertions(+), 3 deletions(-) diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index c5963fd04..bcc0e552c 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,13 @@ +Wed Apr 25 15:07:37 2001 Christopher Faylor + + * sigproc.h [sigthread]: Add exception field. [sigframe::~sigframe]: + Clear exception field. [sigframe::set]: Set exception field from + caller. + * sigproc.cc (sig_send): Set exception field when frame pointer is + passed in. + * exceptions.cc (interrupt_on_return): Always treat exception as + interruptible. + 2001-04-25 Egor Duda * cygwin.din: Export asctime_r, ctime_r, gmtime_r, localtime_r diff --git a/winsup/cygwin/exceptions.cc b/winsup/cygwin/exceptions.cc index 880c4033f..03e00ea4a 100644 --- a/winsup/cygwin/exceptions.cc +++ b/winsup/cygwin/exceptions.cc @@ -735,7 +735,7 @@ interrupt_on_return (sigthread *th, int sig, void *handler, struct sigaction& si thestack.init (ebp); /* Initialize from the input CONTEXT */ for (i = 0; i < 32 && thestack++ ; i++) - if (interruptible (thestack.sf.AddrReturn.Offset)) + if (th->exception || interruptible (thestack.sf.AddrReturn.Offset)) { DWORD *addr_retaddr = ((DWORD *)thestack.sf.AddrFrame.Offset) + 1; if (*addr_retaddr == thestack.sf.AddrReturn.Offset) diff --git a/winsup/cygwin/sigproc.cc b/winsup/cygwin/sigproc.cc index 58c861f98..b1140aaab 100644 --- a/winsup/cygwin/sigproc.cc +++ b/winsup/cygwin/sigproc.cc @@ -680,7 +680,7 @@ sig_send (_pinfo *p, int sig, DWORD ebp) { thiscatch = sigcatch_main; thiscomplete = sigcomplete_main; - thisframe.set (mainthread, ebp); + thisframe.set (mainthread, ebp, 1); } } else if (!(thiscatch = getsem (p, "sigcatch", 0, 0))) diff --git a/winsup/cygwin/sigproc.h b/winsup/cygwin/sigproc.h index 9d8a8c520..c239f5fe7 100644 --- a/winsup/cygwin/sigproc.h +++ b/winsup/cygwin/sigproc.h @@ -40,6 +40,7 @@ struct sigthread DWORD frame; CRITICAL_SECTION lock; LONG winapi_lock; + BOOL exception; bool get_winapi_lock (int test = 0); void release_winapi_lock (); void init (const char *s); @@ -55,6 +56,7 @@ private: { EnterCriticalSection (&st->lock); st->frame = 0; + st->exception = 0; st->release_winapi_lock (); LeaveCriticalSection (&st->lock); st = NULL; @@ -62,11 +64,12 @@ private: } public: - void set (sigthread &t, DWORD ebp) + void set (sigthread &t, DWORD ebp, bool is_exception = 0) { DWORD oframe = t.frame; st = &t; t.frame = ebp; + t.exception = is_exception; if (!oframe) t.get_winapi_lock (); }