Time exception

Stephen Weeks MLton@sourcelight.com
Sat, 21 Apr 2001 14:52:51 -0700 (PDT)

I finally figured out why I consistently get a Time exception when running even
the newest G0 MLton on one of my machines (starlinux).  First hint: the machine
has been up for 281 days.  Second hint: 281 * 24 * 60 * 60 * 100 = 2,427,840,000
> 2^31.

Recall that Posix.ProcEnv.times returns (via the times function) the elapsed
number of clock ticks since the system came up.  Despite the fact that the man
pages say that times returns a clock_t, which is a long int, in fact, times
appears to be returning an unsigned int.  That is, a call to times on starlinux
returns something like 0x90f24469, which has the high bit set.  Both MLton and
SML/NJ assume that clock_t is signed, and therefore think that the elapsed time
is negative, and raise a Time exception.

So, the following simple program causes a Time exception on any machine that has 
been up more than ~248.6 days and has CLK_TICK = 100.

val _ = Posix.ProcEnv.times()

I think that the right fix is to translate clock_t into Word.word in MLton and
to send a bug report to the SML/NJ folks.