aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristopher Faylor <me@cgf.cx>2001-04-25 19:11:37 +0000
committerChristopher Faylor <me@cgf.cx>2001-04-25 19:11:37 +0000
commit968d91b2e6156e84c9fa5a6534364861446549f8 (patch)
treec5d41a6fb28343ad532dd4c96cf27896568493d0
parent86699e1555e3f8438e23530f1a0b49ff87330686 (diff)
downloadnewlib-968d91b2e6156e84c9fa5a6534364861446549f8.zip
newlib-968d91b2e6156e84c9fa5a6534364861446549f8.tar.gz
newlib-968d91b2e6156e84c9fa5a6534364861446549f8.tar.bz2
* 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.
-rw-r--r--winsup/cygwin/ChangeLog10
-rw-r--r--winsup/cygwin/exceptions.cc2
-rw-r--r--winsup/cygwin/sigproc.cc2
-rw-r--r--winsup/cygwin/sigproc.h5
4 files changed, 16 insertions, 3 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog
index c5963fd..bcc0e55 100644
--- a/winsup/cygwin/ChangeLog
+++ b/winsup/cygwin/ChangeLog
@@ -1,3 +1,13 @@
+Wed Apr 25 15:07:37 2001 Christopher Faylor <cgf@cygnus.com>
+
+ * 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 <deo@logos-m.ru>
* cygwin.din: Export asctime_r, ctime_r, gmtime_r, localtime_r
diff --git a/winsup/cygwin/exceptions.cc b/winsup/cygwin/exceptions.cc
index 880c403..03e00ea 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 58c861f..b1140aa 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 9d8a8c5..c239f5f 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 ();
}