Changes by: Jason J. Hickey (jyh at cs.caltech.edu)
Date: 2007-10-30 12:47:54 -0700 (Tue, 30 Oct 2007)
Revision: 12456
Log message:

      I believe I have solved the problem with bogus termination on Windows XP.
     See the message titled "Parallel builds on windows xp" from Doug Rabson on
     Aug 9, 2007.
     
     I *can't* reproduce the problem, but I have an explanation.
     
     If correct, the problem was a double-allocation in omake_shell_sys.c:handle_wait,
     where
        1.   tuple = alloc_tuple(2);
        2.   Field(tuple, 0) = ...
        3.   Field(tuple, 1) = Val_unit;
        4.   status = alloc_small(...)
        5.   Field(tuple, 1) = status;
     
     Line 5 violates the assignment policy, which says that direct
     assignment is allowed only if the tuple was just allocated.
     
     So, the explanation would be that a GC happens at line 4, moving the
     tuple to the major heap, and the assignment on line 5 violates the
     generational invariant (by not keeping track of the old->young pointer).
     This leads to heap corruption, and the result looks like "process stopped",
     only because the stopped case is the last one in pattern matching,
     so it serves as the default.
     
     It seems reasonable at least.

Changes  Path(relative to omake-branches/0.9.8.x/src/clib)
+4 -6 omake_shell_sys.c