(lwpInitSystem): Stack checking doesn't work and is not necessary for

main thread; clear LWP_STACKCHECK.
(lwpStackCheck): Log stack overflow/underflow and abort.
This commit is contained in:
Markus Armbruster 2005-03-16 18:06:03 +00:00
parent 06c326fc5f
commit 75deff7811

View file

@ -50,7 +50,7 @@ extern char *strdup();
#endif /* NOSTRDUP */ #endif /* NOSTRDUP */
static void lwpStackCheckInit(struct lwpProc *newp); static void lwpStackCheckInit(struct lwpProc *newp);
static int lwpStackCheck(struct lwpProc *newp); static void lwpStackCheck(struct lwpProc *newp);
static void lwpStackCheckUsed(struct lwpProc *newp); static void lwpStackCheckUsed(struct lwpProc *newp);
/* check stack direction */ /* check stack direction */
@ -444,7 +444,7 @@ lwpInitSystem(int pri, char **ctxptr, int flags)
LwpCurrent->sbtm = stack; /* dummy stack for "main" */ LwpCurrent->sbtm = stack; /* dummy stack for "main" */
LwpCurrent->pri = pri; LwpCurrent->pri = pri;
LwpCurrent->dead = 0; LwpCurrent->dead = 0;
LwpCurrent->flags = flags; LwpCurrent->flags = flags & ~LWP_STACKCHECK;
LwpCurrent->name = "Main"; LwpCurrent->name = "Main";
for (i = LWP_MAX_PRIO, q = LwpSchedQ; i--; q++) for (i = LWP_MAX_PRIO, q = LwpSchedQ; i--; q++)
q->head = q->tail = 0; q->head = q->tail = 0;
@ -479,14 +479,9 @@ lwpStackCheckInit(struct lwpProc *newp)
/* lwpStackCheck /* lwpStackCheck
* *
* Check if the thread has overflowed/underflowed its stack. * Check if the thread has overflowed/underflowed its stack.
* NOTE: * Should that happen, abort the process, as we cannot recover.
* If an problem occurs, it is not corrected.
* The buffer is not cleaned up, nor is the thread terminated.
* Cleaning up the buffer would be a mistake, and terminating
* the thread, well, could be done. Should more like take
* down the entire process.
*/ */
static int static void
lwpStackCheck(struct lwpProc *newp) lwpStackCheck(struct lwpProc *newp)
{ {
register int end, amt; register int end, amt;
@ -495,8 +490,8 @@ lwpStackCheck(struct lwpProc *newp)
register int growsDown; register int growsDown;
int marker; int marker;
if (!newp || !newp->himark || !newp->lowmark) if (CANT_HAPPEN(!newp || !newp->himark || !newp->lowmark))
return (1); return;
growsDown = growsdown(&marker); growsDown = growsdown(&marker);
for (lp = newp->himark, i = 0; i < LWP_REDZONE / sizeof(long); for (lp = newp->himark, i = 0; i < LWP_REDZONE / sizeof(long);
i++, lp++) { i++, lp++) {
@ -514,9 +509,10 @@ lwpStackCheck(struct lwpProc *newp)
} else { } else {
amt = (i + 1) * sizeof(long); amt = (i + 1) * sizeof(long);
} }
lwpStatus(newp, "Thread stack overflowed %d bytes (of %u)", logerror("Thread %s stack overflow %d bytes (of %u)",
amt, newp->size - 2 * LWP_REDZONE - (int)sizeof(stkalign_t)); newp->name, amt,
return (0); newp->size - 2 * LWP_REDZONE - (int)sizeof(stkalign_t));
abort();
} }
for (lp = newp->lowmark, i = 0; i < LWP_REDZONE / sizeof(long); for (lp = newp->lowmark, i = 0; i < LWP_REDZONE / sizeof(long);
i++, lp++) { i++, lp++) {
@ -534,11 +530,11 @@ lwpStackCheck(struct lwpProc *newp)
} else { } else {
amt = (LWP_REDZONE - i + 1) * sizeof(long); amt = (LWP_REDZONE - i + 1) * sizeof(long);
} }
lwpStatus(newp, "Thread stack underflow %d bytes (of %u)", logerror("Thread %s stack underflow %d bytes (of %u)",
amt, newp->size - 2 * LWP_REDZONE - (int)sizeof(stkalign_t)); newp->name, amt,
return (0); newp->size - 2 * LWP_REDZONE - (int)sizeof(stkalign_t));
abort();
} }
return (1);
} }
/* lwpStackCheckUsed /* lwpStackCheckUsed