]> git.pond.sub.org Git - empserver/commitdiff
(lwpInitSystem): Stack checking doesn't work and is not necessary for
authorMarkus Armbruster <armbru@pond.sub.org>
Wed, 16 Mar 2005 18:06:03 +0000 (18:06 +0000)
committerMarkus Armbruster <armbru@pond.sub.org>
Wed, 16 Mar 2005 18:06:03 +0000 (18:06 +0000)
main thread; clear LWP_STACKCHECK.
(lwpStackCheck): Log stack overflow/underflow and abort.

src/lib/lwp/lwp.c

index 9696305061ba1a8eca62ce03bbe9303f300030d1..464dbdd30c8d4a52bac0dbf31255818df40ad522 100644 (file)
@@ -50,7 +50,7 @@ extern char *strdup();
 #endif /* NOSTRDUP */
 
 static void lwpStackCheckInit(struct lwpProc *newp);
 #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 */
 static void lwpStackCheckUsed(struct lwpProc *newp);
 
 /* check stack direction */
@@ -444,7 +444,7 @@ lwpInitSystem(int pri, char **ctxptr, int flags)
     LwpCurrent->sbtm = stack;  /* dummy stack for "main" */
     LwpCurrent->pri = pri;
     LwpCurrent->dead = 0;
     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;
     LwpCurrent->name = "Main";
     for (i = LWP_MAX_PRIO, q = LwpSchedQ; i--; q++)
        q->head = q->tail = 0;
@@ -479,14 +479,9 @@ lwpStackCheckInit(struct lwpProc *newp)
 /* lwpStackCheck
  *
  * Check if the thread has overflowed/underflowed its stack.
 /* 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;
 lwpStackCheck(struct lwpProc *newp)
 {
     register int end, amt;
@@ -495,8 +490,8 @@ lwpStackCheck(struct lwpProc *newp)
     register int growsDown;
     int marker;
 
     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++) {
     growsDown = growsdown(&marker);
     for (lp = newp->himark, i = 0; i < LWP_REDZONE / sizeof(long);
         i++, lp++) {
@@ -514,9 +509,10 @@ lwpStackCheck(struct lwpProc *newp)
        } else {
            amt = (i + 1) * sizeof(long);
        }
        } 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++) {
     }
     for (lp = newp->lowmark, i = 0; i < LWP_REDZONE / sizeof(long);
         i++, lp++) {
@@ -534,11 +530,11 @@ lwpStackCheck(struct lwpProc *newp)
        } else {
            amt = (LWP_REDZONE - i + 1) * sizeof(long);
        }
        } 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
 }
 
 /* lwpStackCheckUsed