* 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.
This commit is contained in:
@@ -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 ();
|
||||
}
|
||||
|
Reference in New Issue
Block a user