From 0a3c5f5ac686d02b29a0b8bef1d89a76a01808e0 Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Mon, 14 Dec 2009 01:09:04 -0600 Subject: [PATCH] vm: fep out if monotonic counter decreases --- vm/run.cpp | 5 ++++- vm/vm.cpp | 3 ++- vm/vm.hpp | 4 ++++ 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/vm/run.cpp b/vm/run.cpp index 1bb2e0c44e..583d4f658b 100755 --- a/vm/run.cpp +++ b/vm/run.cpp @@ -15,7 +15,10 @@ void factor_vm::primitive_system_micros() void factor_vm::primitive_nano_count() { - box_unsigned_8(nano_count()); + u64 nanos = nano_count(); + if(nanos < last_nano_count) critical_error("Monotonic counter decreased",0); + last_nano_count = nanos; + box_unsigned_8(nanos); } void factor_vm::primitive_sleep() diff --git a/vm/vm.cpp b/vm/vm.cpp index 72c63292fd..d911b80227 100755 --- a/vm/vm.cpp +++ b/vm/vm.cpp @@ -10,7 +10,8 @@ factor_vm::factor_vm() : current_gc(NULL), gc_events(NULL), fep_disabled(false), - full_output(false) + full_output(false), + last_nano_count(0) { primitive_reset_dispatch_stats(); } diff --git a/vm/vm.hpp b/vm/vm.hpp index 2d78bae709..a3019bd054 100755 --- a/vm/vm.hpp +++ b/vm/vm.hpp @@ -87,6 +87,10 @@ struct factor_vm /* Incrementing object counter for identity hashing */ cell object_counter; + /* Sanity check to ensure that monotonic counter doesn't + decrease */ + u64 last_nano_count; + // contexts void reset_datastack(); void reset_retainstack();