]> gitweb.factorcode.org Git - factor.git/commitdiff
vm: fep out if monotonic counter decreases
authorSlava Pestov <slava@factorcode.org>
Mon, 14 Dec 2009 07:09:04 +0000 (01:09 -0600)
committerSlava Pestov <slava@factorcode.org>
Mon, 14 Dec 2009 07:09:04 +0000 (01:09 -0600)
vm/run.cpp
vm/vm.cpp
vm/vm.hpp

index 1bb2e0c44ebdc8e879810d45b7b66dd149b50ecb..583d4f658bc9cc6f2c83d35e9b904479d9043483 100755 (executable)
@@ -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()
index 72c63292fd94d25d89d85a9832fb492c0eaaae61..d911b80227d009befe6151a84ac341cd695a0bb7 100755 (executable)
--- a/vm/vm.cpp
+++ b/vm/vm.cpp
@@ -10,7 +10,8 @@ factor_vm::factor_vm() :
        current_gc(NULL),\r
        gc_events(NULL),\r
        fep_disabled(false),\r
-       full_output(false)\r
+       full_output(false),\r
+       last_nano_count(0)\r
 {\r
        primitive_reset_dispatch_stats();\r
 }\r
index 2d78bae709846629d77b9a20e9f6bc2d459bacfe..a3019bd05438d0c076b4ffb8bff290f970e838f8 100755 (executable)
--- 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();