2004-10-22 18:45:08 +00:00
|
|
|
#if defined(__linux__)
|
2004-09-21 01:11:28 +00:00
|
|
|
#include "ucontext.c"
|
2004-10-22 18:45:08 +00:00
|
|
|
#else
|
2004-09-21 01:11:28 +00:00
|
|
|
|
2003-09-30 17:47:42 +00:00
|
|
|
#include "threadimpl.h"
|
2004-04-21 19:29:04 +00:00
|
|
|
/*
|
|
|
|
|
* To use this you need some patches to Valgrind that
|
|
|
|
|
* let it help out with detecting stack overflow.
|
|
|
|
|
*/
|
|
|
|
|
#ifdef USEVALGRIND
|
|
|
|
|
#include <valgrind/memcheck.h>
|
|
|
|
|
#endif
|
2003-09-30 17:47:42 +00:00
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
launcher386(void (*f)(void *arg), void *arg)
|
|
|
|
|
{
|
2004-04-21 19:29:04 +00:00
|
|
|
Proc *p;
|
|
|
|
|
Thread *t;
|
|
|
|
|
|
|
|
|
|
p = _threadgetproc();
|
|
|
|
|
t = p->thread;
|
2004-05-11 17:51:27 +00:00
|
|
|
_threadstacklimit(t->stk, t->stk+t->stksize);
|
2004-04-21 19:29:04 +00:00
|
|
|
|
2003-09-30 17:47:42 +00:00
|
|
|
(*f)(arg);
|
|
|
|
|
threadexits(nil);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
_threadinitstack(Thread *t, void (*f)(void*), void *arg)
|
|
|
|
|
{
|
|
|
|
|
ulong *tos;
|
|
|
|
|
|
|
|
|
|
tos = (ulong*)&t->stk[t->stksize&~7];
|
|
|
|
|
*--tos = (ulong)arg;
|
|
|
|
|
*--tos = (ulong)f;
|
|
|
|
|
t->sched.pc = (ulong)launcher386;
|
|
|
|
|
t->sched.sp = (ulong)tos - 8; /* old PC and new PC */
|
|
|
|
|
}
|
|
|
|
|
|
2004-04-21 19:29:04 +00:00
|
|
|
void
|
|
|
|
|
_threadinswitch(int enter)
|
|
|
|
|
{
|
|
|
|
|
USED(enter);
|
|
|
|
|
#ifdef USEVALGRIND
|
|
|
|
|
if(enter)
|
|
|
|
|
VALGRIND_SET_STACK_LIMIT(0, 0, 0);
|
2004-05-11 17:51:27 +00:00
|
|
|
else
|
|
|
|
|
VALGRIND_SET_STACK_LIMIT(0, 0, 1);
|
2004-04-21 19:29:04 +00:00
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
2004-05-11 17:51:27 +00:00
|
|
|
_threadstacklimit(void *bottom, void *top)
|
2004-04-21 19:29:04 +00:00
|
|
|
{
|
2004-05-11 17:51:27 +00:00
|
|
|
USED(bottom);
|
|
|
|
|
USED(top);
|
2004-04-21 19:29:04 +00:00
|
|
|
|
|
|
|
|
#ifdef USEVALGRIND
|
2004-05-11 17:51:27 +00:00
|
|
|
VALGRIND_SET_STACK_LIMIT(1, bottom, top);
|
2004-04-21 19:29:04 +00:00
|
|
|
#endif
|
|
|
|
|
}
|
2004-09-21 01:11:28 +00:00
|
|
|
#endif
|