#endif /* NOSTRDUP */
static void lwpStackCheckInit(struct lwpProc *newp);
-static int lwpStackCheck(struct lwpProc *newp);
+static void lwpStackCheck(struct lwpProc *newp);
static void lwpStackCheckUsed(struct lwpProc *newp);
/* check stack direction */
LwpCurrent->sbtm = stack; /* dummy stack for "main" */
LwpCurrent->pri = pri;
LwpCurrent->dead = 0;
- LwpCurrent->flags = flags;
+ LwpCurrent->flags = flags & ~LWP_STACKCHECK;
LwpCurrent->name = "Main";
for (i = LWP_MAX_PRIO, q = LwpSchedQ; i--; q++)
q->head = q->tail = 0;
/* lwpStackCheck
*
* Check if the thread has overflowed/underflowed its stack.
- * NOTE:
- * 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.
+ * Should that happen, abort the process, as we cannot recover.
*/
-static int
+static void
lwpStackCheck(struct lwpProc *newp)
{
register int end, amt;
register int growsDown;
int marker;
- if (!newp || !newp->himark || !newp->lowmark)
- return (1);
+ if (CANT_HAPPEN(!newp || !newp->himark || !newp->lowmark))
+ return;
growsDown = growsdown(&marker);
for (lp = newp->himark, i = 0; i < LWP_REDZONE / sizeof(long);
i++, lp++) {
} else {
amt = (i + 1) * sizeof(long);
}
- lwpStatus(newp, "Thread stack overflowed %d bytes (of %u)",
- amt, newp->size - 2 * LWP_REDZONE - (int)sizeof(stkalign_t));
- return (0);
+ logerror("Thread %s stack overflow %d bytes (of %u)",
+ newp->name, amt,
+ newp->size - 2 * LWP_REDZONE - (int)sizeof(stkalign_t));
+ abort();
}
for (lp = newp->lowmark, i = 0; i < LWP_REDZONE / sizeof(long);
i++, lp++) {
} else {
amt = (LWP_REDZONE - i + 1) * sizeof(long);
}
- lwpStatus(newp, "Thread stack underflow %d bytes (of %u)",
- amt, newp->size - 2 * LWP_REDZONE - (int)sizeof(stkalign_t));
- return (0);
+ logerror("Thread %s stack underflow %d bytes (of %u)",
+ newp->name, amt,
+ newp->size - 2 * LWP_REDZONE - (int)sizeof(stkalign_t));
+ abort();
}
- return (1);
}
/* lwpStackCheckUsed