Add needstack to libthread.
[rsc] --rw-rw-r-- M 1428987 glenda sys 3616 Jan 28 10:48 sys/include/thread.h
/n/sourcesdump/2006/0128/plan9/sys/include/thread.h:69,74 -
/n/sourcesdump/2006/0129/plan9/sys/include/thread.h:69,75
int nbsend(Channel *c, void *v);
int nbsendp(Channel *c, void *v);
int nbsendul(Channel *c, ulong v);
+ void needstack(int);
int proccreate(void (*f)(void *arg), void *arg, uint stacksize);
int procrfork(void (*f)(void *arg), void *arg, uint stacksize, int flag);
void** procdata(void);
[rsc] --rw-rw-r-- M 1428987 glenda sys 3342 Jan 28 10:47 sys/src/libthread/sched.c
/n/sourcesdump/2006/0128/plan9/sys/src/libthread/sched.c:78,83 -
/n/sourcesdump/2006/0129/plan9/sys/src/libthread/sched.c:78,101
}
void
+ needstack(int n)
+ {
+ int x;
+ Proc *p;
+ Thread *t;
+
+ p = _threadgetproc();
+ t = p->thread;
+
+ if((uchar*)&x - n < (uchar*)t->stk){
+ fprint(2, "%s %d: &x=%p n=%d t->stk=%p\n",
+ argv0, getpid(), &x, n, t->stk);
+ fprint(2, "%s %d: stack overflow\n", argv0, getpid());
+ abort();
+ }
+ }
+
+ void
_sched(void)
{
Proc *p;
/n/sourcesdump/2006/0128/plan9/sys/src/libthread/sched.c:86,93 -
/n/sourcesdump/2006/0129/plan9/sys/src/libthread/sched.c:104,110
Resched:
p = _threadgetproc();
if((t = p->thread) != nil){
- if((uchar*)&p < t->stk) /* stack overflow */
- abort();
+ needstack(128);
_threaddebug(DBGSCHED, "pausing, state=%s", psstate(t->state));
if(setjmp(t->sched)==0)
longjmp(p->sched, 1);
|