commit fb36ed82ec7470efe4e334ddc054bcb4fa06ae9e from: rsc date: Wed Apr 21 22:47:15 2004 UTC how much stack do we need? commit - 2b4b2ae19107f2c7e45ca6ab6f73c9c8a5fb84dd commit + fb36ed82ec7470efe4e334ddc054bcb4fa06ae9e blob - 57d597baf4ae1887f8bab9aede2e6f00ac7cff5d blob + 9ad7298b251835df505807d2d65656f66f718690 --- src/libthread/sched.c +++ src/libthread/sched.c @@ -154,6 +154,21 @@ relock: q->head = t->next; unlock(&p->readylock); return t; +} + +void +needstack(int howmuch) +{ + Proc *p; + Thread *t; + + p = _threadgetproc(); + if(p == nil || (t=p->thread) == nil) + return; + if((ulong)&howmuch < (ulong)t->stk+howmuch){ /* stack overflow waiting to happen */ + fprint(2, "stack overflow: stack at 0x%lux, limit at 0x%lux, need 0x%lux\n", (ulong)&p, (ulong)t->stk, howmuch); + abort(); + } } void @@ -166,10 +181,7 @@ Resched: p = _threadgetproc(); //fprint(2, "p %p\n", p); if((t = p->thread) != nil){ - if((ulong)&p < (ulong)t->stk+512){ /* stack overflow waiting to happen */ - fprint(2, "stack overflow: stack at %lux, limit at %lux\n", (ulong)&p, (ulong)t->stk); - abort(); - } + needstack(512); // _threaddebug(DBGSCHED, "pausing, state=%s set %p goto %p", // psstate(t->state), &t->sched, &p->sched); if(_setlabel(&t->sched)==0)