return res;
}
+static void __stdcall interrupt_setup (int sig, void *handler, DWORD retaddr,
+ DWORD *retaddr_on_stack,
+ struct sigaction& siga)
+ __attribute__((regparm(3)));
static void __stdcall
-interrupt_setup (int sig, struct sigaction& siga, void *handler,
- DWORD retaddr, DWORD *retaddr_on_stack)
+interrupt_setup (int sig, void *handler, DWORD retaddr, DWORD *retaddr_on_stack,
+ struct sigaction& siga)
{
sigsave.retaddr = retaddr;
sigsave.retaddr_on_stack = retaddr_on_stack;
sigsave.saved_errno = -1; // Flag: no errno to save
}
+static bool interrupt_now (CONTEXT *, int, void *, struct sigaction&) __attribute__((regparm(3)));
static bool
-interrupt_now (CONTEXT *ctx, int sig, struct sigaction& siga, void *handler)
+interrupt_now (CONTEXT *ctx, int sig, void *handler, struct sigaction& siga)
{
- interrupt_setup (sig, siga, handler, ctx->Eip, 0);
+ interrupt_setup (sig, handler, ctx->Eip, 0, siga);
ctx->Eip = (DWORD) sigdelayed;
SetThreadContext (myself->getthread2signal (), ctx); /* Restart the thread */
return 1;
}
}
+static int interrupt_on_return (sigthread *, int, void *, struct sigaction&) __attribute__((regparm(3)));
static int
-interrupt_on_return (sigthread *th, int sig, struct sigaction& siga, void *handler)
+interrupt_on_return (sigthread *th, int sig, void *handler, struct sigaction& siga)
{
int i;
DWORD ebp = th->frame;
DWORD *addr_retaddr = ((DWORD *)thestack.sf.AddrFrame.Offset) + 1;
if (*addr_retaddr == thestack.sf.AddrReturn.Offset)
{
- interrupt_setup (sig, siga, handler, *addr_retaddr, addr_retaddr);
+ interrupt_setup (sig, handler, *addr_retaddr, addr_retaddr, siga);
*addr_retaddr = (DWORD) sigdelayed;
}
return 1;
// sigproc_printf ("errno %d", e);
}
+static int call_handler (int, void *, struct sigaction&) __attribute__((regparm(3)));
static int
-call_handler (int sig, struct sigaction& siga, void *handler)
+call_handler (int sig, void *handler, struct sigaction& siga)
{
CONTEXT cx;
bool interrupted = 0;
try_to_interrupt:
if (th)
{
- interrupted = interrupt_on_return (th, sig, siga, handler);
+ interrupted = interrupt_on_return (th, sig, handler, siga);
if (!interrupted)
LeaveCriticalSection (&th->lock);
}
else if (interruptible (cx.Eip))
- interrupted = interrupt_now (&cx, sig, siga, handler);
+ interrupted = interrupt_now (&cx, sig, handler, siga);
else
break;
}
dosig:
/* Dispatch to the appropriate function. */
sigproc_printf ("signal %d, about to call %p", sig, thissig.sa_handler);
- rc = call_handler (sig, thissig, handler);
+ rc = call_handler (sig, handler, thissig);
done:
sigproc_printf ("returning %d", rc);