time bug

Matthew Fluet fluet@CS.Cornell.EDU
Sun, 25 Mar 2001 12:45:18 -0500 (EST)


  This message is in MIME format.  The first part should be readable text,
  while the remaining parts are likely unreadable without MIME-aware tools.
  Send mail to mime@docserver.cac.washington.edu for more info.

---559023410-1297389768-985542318=:5402
Content-Type: TEXT/PLAIN; charset=US-ASCII


I think I've squashed the Time bug.  Turns out there were really three
different bugs that were all contributing to the exceptions.

1. src/runtime/gc.c 

I don't know if this is really a bug, but currentTime() now uses times()
instead of getrusage(). 

2. src/lib/mlton/basic/times.{sig,sml}
   src/mlton/control/control.sml

This is somewhat interesting.  The Time.times() function was defined as
follows:

fun times () =
   let
      val {cstime, cutime, elapsed, stime, utime} = Posix.ProcEnv.times ()
   in
      {cstime = cstime,
       cutime = cutime,
       elapsed = elapsed,
       gc = MLton.GC.time (),
       stime = stime,
       utime = utime}
   end

and Control.trace invokes Time.times just before and just after executing
the traced function.  So, the essential executions are:

Posix.ProcEnv.times ()  \ Time.times ()
MLton.GC.time ()        /
f
Posix.ProcEnv.times ()  \ Time.times ()
MLton.GC.time ()        /

The total time is computed from the two Posix.ProcEnv.times calls and the
total gc time is computed from the two MLton.GC.time calls.  So, there is
a small probability that between executing Posix.ProcEnv.times and
executing MLton.GC.time, a (time-consuming) GC is invoked, which appears
in the result of MLton.GC.time, but not in the result of
Posix.ProcEnv.times.

The only way around this is to have two Time.times functions, with
executions like:

Posix.ProcEnv.times ()  \ Time.timesPre ()
MLton.GC.time ()        /
f
MLton.GC.time ()        \ Times.timesPost ()
Posix.ProcEnv.times ()  /

so the gc time is really bounded by the process time.

I updated /src/lib/mlton/basic/times.{sig,fun} with timesPre and
timesPost, and bound times to timesPre for compatibility.

3. src/basis-library/posix/proc-env.sml
   src/basis-library/mlton/gc.sml

There are rounding differences in converting from the C function times() 
values to Time.time values for the Posix.ProcEnv.times call and the
MLton.GC.time call: 

(* MLton.GC.time *)
    fun time () =
      Time.fromMilliseconds (LargeInt.fromInt (Primitive.MLton.gcTime ()))

(* Posix.ProcEnv.times *)

      local
	 structure Tms = Prim.Tms

	 val ticksPerSec = Real.fromInt(SysWord.toIntX(sysconf "CLK_TCK"))
	 fun cvt ticks = Time.fromReal(Real.fromInt ticks / ticksPerSec)
      in
	 fun times() =
	    let val elapsed = Prim.times()
	    in Error.checkResult elapsed;
	       {elapsed = cvt elapsed,
		utime = cvt(Tms.utime()), 
		stime = cvt(Tms.stime()), 
		cutime = cvt(Tms.cutime()), 
		cstime = cvt(Tms.cstime())}
	    end
      end

I modified Posix.ProcEnv.times to use Time.fromMilliseconds rather
than Time.fromReal.  This might be less accurate, but modifying
MLton.GC.gcTime to use Time.fromReal doesn't work.  The problem is
that gc.c aggregates {utime,stime,cutime,cstime}, so MLton.GC.gcTime
converts the sum.  So, when Posix.ProcEnv.times and MLton.GC.gcTime
are called very close to one another, the underling C function times
might return the same values, but flooring the individual sub-times
rounds down in Posix.ProcEnv.times, while converting the aggregate
time in MLton.GC.gcTime rounds up.  It seems to me that the
modification I made might still lead to discrepencies, but I haven't
seen any; whereas, with the alterative modification, I see them a lot.


I'm also including 
 \bugs\timeBug1.sml
 \bugs\timeBug2.sml

timeBug1.sml recreates the original time bug.  Compiled with
mlton-20010321, you should see messages for each time the total gc
time for a traced function was greater than the total time for the
function.  Note, this entire bug is also somewhat dependent on
processor speed, I think.  I raise it all the time on an dual 800Mhz
PIII, but less often on a 500Mhz PIII.  (I don't think it is related
to the multiprocessors, because it is still raised when I run with a
non-SMP kernel.)  

timeBug1.sml should still raise a bug, even with the modifications to
the runtime and the basis library.  This demonstrates sub-bug #2,
where a costly GC could cause problems.  In practice, I can't get this
to raise, but I still think the bug is there in theory.  (This was
actually the first thing I tried fixing, and when that didn't work, I
discovered the rounding errors.)

timeBug2.sml incorporates timesPre and timesPost, and should not raise
any errors with the runtime and basis-library modifications.


---559023410-1297389768-985542318=:5402
Content-Type: TEXT/PLAIN; charset=US-ASCII; name="timeBug2.sml"
Content-Transfer-Encoding: BASE64
Content-ID: <Pine.SOL.3.95.1010325124518.5402J@hoho.cs.cornell.edu>
Content-Description: 

DQpsb2NhbCANCiAgb3BlbiBUaW1lDQoNCiAgdHlwZSB0ID0gdGltZQ0KDQogIHR5cGUgdGltZXMg
PQ0KICAgIHsNCiAgICAgY3N0aW1lOiB0LA0KICAgICBjdXRpbWU6IHQsDQogICAgIGVsYXBzZWQ6
IHQsDQogICAgIGdjOiB0LA0KICAgICBzdGltZTogdCwNCiAgICAgdXRpbWU6IHQNCiAgICAgfQ0K
DQogIGZ1biB0aW1lc1ByZSAoKSA9DQogICAgbGV0DQogICAgICB2YWwge2NzdGltZSwgY3V0aW1l
LCBlbGFwc2VkLCBzdGltZSwgdXRpbWV9ID0gUG9zaXguUHJvY0Vudi50aW1lcyAoKQ0KICAgICAg
dmFsIGdjID0gTUx0b24uR0MudGltZSAoKQ0KICAgIGluDQogICAgICB7Y3N0aW1lID0gY3N0aW1l
LA0KICAgICAgIGN1dGltZSA9IGN1dGltZSwNCiAgICAgICBlbGFwc2VkID0gZWxhcHNlZCwNCiAg
ICAgICBnYyA9IGdjLA0KICAgICAgIHN0aW1lID0gc3RpbWUsDQogICAgICAgdXRpbWUgPSB1dGlt
ZX0NCiAgICBlbmQNCg0KICBmdW4gdGltZXNQb3N0ICgpID0NCiAgICBsZXQNCiAgICAgIHZhbCBn
YyA9IE1MdG9uLkdDLnRpbWUgKCkNCiAgICAgIHZhbCB7Y3N0aW1lLCBjdXRpbWUsIGVsYXBzZWQs
IHN0aW1lLCB1dGltZX0gPSBQb3NpeC5Qcm9jRW52LnRpbWVzICgpDQogICAgaW4NCiAgICAgIHtj
c3RpbWUgPSBjc3RpbWUsDQogICAgICAgY3V0aW1lID0gY3V0aW1lLA0KICAgICAgIGVsYXBzZWQg
PSBlbGFwc2VkLA0KICAgICAgIGdjID0gZ2MsDQogICAgICAgc3RpbWUgPSBzdGltZSwNCiAgICAg
ICB1dGltZSA9IHV0aW1lfQ0KICAgIGVuZA0KDQogIGZ1biB0aW1lUHJlICgpID0NCiAgICBsZXQN
CiAgICAgIHZhbCB7Y3N0aW1lLCBjdXRpbWUsIGdjLCBzdGltZSwgdXRpbWUsIC4uLn0gPSB0aW1l
c1ByZSAoKQ0KICAgIGluDQogICAgICAoY3N0aW1lICsgY3V0aW1lICsgc3RpbWUgKyB1dGltZSwg
Z2MpDQogICAgZW5kDQoNCiAgZnVuIHRpbWVQb3N0ICgpID0NCiAgICBsZXQNCiAgICAgIHZhbCB7
Y3N0aW1lLCBjdXRpbWUsIGdjLCBzdGltZSwgdXRpbWUsIC4uLn0gPSB0aW1lc1Bvc3QgKCkNCiAg
ICBpbg0KICAgICAgKGNzdGltZSArIGN1dGltZSArIHN0aW1lICsgdXRpbWUsIGdjKQ0KICAgIGVu
ZA0KaW4NCiAgZnVuIGNoZWNrVGltZSBmIGEgPSANCiAgICBsZXQNCiAgICAgIHZhbCAodCwgZ2Mp
ID0gdGltZVByZSAoKQ0KICAgICAgZnVuIGRvbmUgKCkgPQ0KICAgICAgICBsZXQNCgkgIHZhbCAo
dCcsIGdjJykgPSB0aW1lUG9zdCAoKQ0KCSAgdmFsIFQgPSB0JyAtIHQNCgkgIHZhbCBHQyA9IGdj
JyAtIGdjDQoJaW4NCgkgIGlmIEdDID4gVA0KCSAgICB0aGVuIHByaW50IChjb25jYXQgWyIgdCA9
ICIsDQoJCQkJVGltZS5mbXQgNiB0LA0KCQkJCSIgZ2MgPSAiLA0KCQkJCVRpbWUuZm10IDYgZ2Ms
DQoJCQkJIiB0JyA9ICIsDQoJCQkJVGltZS5mbXQgNiB0JywNCgkJCQkiIGdjJyA9ICIsDQoJCQkJ
VGltZS5mbXQgNiBnYycsDQoJCQkJIiBUID0gIiwNCgkJCQlUaW1lLmZtdCA2IFQsDQoJCQkJIiBH
QyA9ICIsDQoJCQkJVGltZS5mbXQgNiBHQywNCgkJCQkiXG4iXSkNCgkgICAgZWxzZSAoKQ0KCWVu
ZA0KICAgIGluDQogICAgICAoZiBhIGJlZm9yZSBkb25lICgpKQ0KICAgIGVuZA0KZW5kDQoNCmZ1
biBzbm9jICh4LFtdKSA9IFt4XQ0KICB8IHNub2MgKHgsaDo6dCkgPSBoOjooc25vYyh4LHQpKQ0K
IA0KdmFsIHNub2MgOiAoaW50ICogaW50IGxpc3QpIC0+IGludCBsaXN0ID0gY2hlY2tUaW1lIHNu
b2MNCg0KZnVuIGxvb3AgKDAsIGwpID0gbA0KICB8IGxvb3AgKG4sIGwpID0gbG9vcChuLTEsc25v
YyhuLGwpKQ0KDQp2YWwgbG9vcCA9IGNoZWNrVGltZSBsb29wDQoNCmZ1biBkb2l0ICgpID0gbG9v
cCgxMDAwMDAsIFtdKQ0KDQp2YWwgZG9pdCA9IGNoZWNrVGltZSBkb2l0DQoNCmZ1biByZXBlYXQg
KGYsIDApID0gKCkNCiAgfCByZXBlYXQgKGYsIG4pID0gKGYgKCk7IHJlcGVhdCAoZiwgbiAtIDEp
KQ0KDQp2YWwgXyA9IHJlcGVhdCAoZG9pdCwgMTApDQo=

---559023410-1297389768-985542318=:5402
Content-Type: TEXT/PLAIN; charset=US-ASCII; name="timeBug1.sml"
Content-Transfer-Encoding: BASE64
Content-ID: <Pine.SOL.3.95.1010325124518.5402K@hoho.cs.cornell.edu>
Content-Description: 

DQpsb2NhbCANCiAgb3BlbiBUaW1lDQoNCiAgdHlwZSB0ID0gdGltZQ0KDQogIHR5cGUgdGltZXMg
PQ0KICAgIHsNCiAgICAgY3N0aW1lOiB0LA0KICAgICBjdXRpbWU6IHQsDQogICAgIGVsYXBzZWQ6
IHQsDQogICAgIGdjOiB0LA0KICAgICBzdGltZTogdCwNCiAgICAgdXRpbWU6IHQNCiAgICAgfQ0K
DQogIGZ1biB0aW1lcyAoKSA9DQogICAgbGV0DQogICAgICB2YWwge2NzdGltZSwgY3V0aW1lLCBl
bGFwc2VkLCBzdGltZSwgdXRpbWV9ID0gUG9zaXguUHJvY0Vudi50aW1lcyAoKQ0KICAgIGluDQog
ICAgICB7Y3N0aW1lID0gY3N0aW1lLA0KICAgICAgIGN1dGltZSA9IGN1dGltZSwNCiAgICAgICBl
bGFwc2VkID0gZWxhcHNlZCwNCiAgICAgICBnYyA9IE1MdG9uLkdDLnRpbWUgKCksDQogICAgICAg
c3RpbWUgPSBzdGltZSwNCiAgICAgICB1dGltZSA9IHV0aW1lfQ0KICAgIGVuZA0KDQogIGZ1biB0
aW1lICgpID0NCiAgICBsZXQNCiAgICAgIHZhbCB7Y3N0aW1lLCBjdXRpbWUsIGdjLCBzdGltZSwg
dXRpbWUsIC4uLn0gPSB0aW1lcyAoKQ0KICAgIGluDQogICAgICAoY3N0aW1lICsgY3V0aW1lICsg
c3RpbWUgKyB1dGltZSwgZ2MpDQogICAgZW5kDQppbg0KICBmdW4gY2hlY2tUaW1lIGYgYSA9IA0K
ICAgIGxldA0KICAgICAgdmFsICh0LCBnYykgPSB0aW1lICgpDQogICAgICBmdW4gZG9uZSAoKSA9
DQogICAgICAgIGxldA0KCSAgdmFsICh0JywgZ2MnKSA9IHRpbWUgKCkNCgkgIHZhbCBUID0gdCcg
LSB0DQoJICB2YWwgR0MgPSBnYycgLSBnYw0KCWluDQoJICBpZiBHQyA+IFQNCgkgICAgdGhlbiBw
cmludCAoY29uY2F0IFsiIHQgPSAiLA0KCQkJCVRpbWUuZm10IDYgdCwNCgkJCQkiIGdjID0gIiwN
CgkJCQlUaW1lLmZtdCA2IGdjLA0KCQkJCSIgdCcgPSAiLA0KCQkJCVRpbWUuZm10IDYgdCcsDQoJ
CQkJIiBnYycgPSAiLA0KCQkJCVRpbWUuZm10IDYgZ2MnLA0KCQkJCSIgVCA9ICIsDQoJCQkJVGlt
ZS5mbXQgNiBULA0KCQkJCSIgR0MgPSAiLA0KCQkJCVRpbWUuZm10IDYgR0MsDQoJCQkJIlxuIl0p
DQoJICAgIGVsc2UgKCkNCgllbmQNCiAgICBpbg0KICAgICAgKGYgYSBiZWZvcmUgZG9uZSAoKSkN
CiAgICBlbmQNCmVuZA0KDQpmdW4gc25vYyAoeCxbXSkgPSBbeF0NCiAgfCBzbm9jICh4LGg6OnQp
ID0gaDo6KHNub2MoeCx0KSkNCiANCnZhbCBzbm9jIDogKGludCAqIGludCBsaXN0KSAtPiBpbnQg
bGlzdCA9IGNoZWNrVGltZSBzbm9jDQoNCmZ1biBsb29wICgwLCBsKSA9IGwNCiAgfCBsb29wIChu
LCBsKSA9IGxvb3Aobi0xLHNub2MobixsKSkNCg0KdmFsIGxvb3AgPSBjaGVja1RpbWUgbG9vcA0K
DQpmdW4gZG9pdCAoKSA9IGxvb3AoMTAwMDAwLCBbXSkNCg0KdmFsIGRvaXQgPSBjaGVja1RpbWUg
ZG9pdA0KDQpmdW4gcmVwZWF0IChmLCAwKSA9ICgpDQogIHwgcmVwZWF0IChmLCBuKSA9IChmICgp
OyByZXBlYXQgKGYsIG4gLSAxKSkNCg0KdmFsIF8gPSByZXBlYXQgKGRvaXQsIDEwKQ0K

---559023410-1297389768-985542318=:5402
Content-Type: APPLICATION/octet-stream; name="update.tgz"
Content-Transfer-Encoding: BASE64
Content-ID: <Pine.SOL.3.95.1010325124518.5402L@hoho.cs.cornell.edu>
Content-Description: 

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

---559023410-1297389768-985542318=:5402--