From c08fa9cb6e4eb19739a6a3674c819553f6b78527 Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Sat, 6 Feb 2010 00:45:06 -0600 Subject: [PATCH] vm: disable silly nano-count workaround on Win64, fix some indentation issues --- vm/io.cpp | 37 +++++++++++++++---------------------- vm/os-windows-nt.cpp | 14 +++++++++----- vm/os-windows.cpp | 4 ++-- 3 files changed, 26 insertions(+), 29 deletions(-) diff --git a/vm/io.cpp b/vm/io.cpp index ae27b5a3d8..8eaaa453b5 100755 --- a/vm/io.cpp +++ b/vm/io.cpp @@ -154,7 +154,7 @@ void factor_vm::primitive_fopen() FILE *file; file = safe_fopen((char *)(path.untagged() + 1), - (char *)(mode.untagged() + 1)); + (char *)(mode.untagged() + 1)); ctx->push(allot_alien(file)); } @@ -187,31 +187,24 @@ void factor_vm::primitive_fread() data_root buf(allot_uninitialized_array(size),this); - for(;;) + int c = safe_fread(buf.untagged() + 1,1,size,file); + if(c == 0) { - int c = safe_fread(buf.untagged() + 1,1,size,file); - if(c == 0) - { - if(feof(file)) - { - ctx->push(false_object); - break; - } - else - io_error(); - } + if(feof(file)) + ctx->push(false_object); else + io_error(); + } + else + { + if(feof(file)) { - if(feof(file)) - { - byte_array *new_buf = allot_byte_array(c); - memcpy(new_buf + 1, buf.untagged() + 1,c); - buf = new_buf; - } - - ctx->push(buf.value()); - break; + byte_array *new_buf = allot_byte_array(c); + memcpy(new_buf + 1, buf.untagged() + 1,c); + buf = new_buf; } + + ctx->push(buf.value()); } } diff --git a/vm/os-windows-nt.cpp b/vm/os-windows-nt.cpp index cf5878e5bf..644ff83b44 100755 --- a/vm/os-windows-nt.cpp +++ b/vm/os-windows-nt.cpp @@ -37,8 +37,6 @@ u64 system_micros() - EPOCH_OFFSET) / 10; } -/* On VirtualBox, QueryPerformanceCounter does not increment -the high part every time the low part overflows. Workaround. */ u64 nano_count() { LARGE_INTEGER count; @@ -53,8 +51,14 @@ u64 nano_count() if(ret == 0) fatal_error("QueryPerformanceFrequency", 0); - if(count.LowPart < lo) - hi += 1; +#ifdef FACTOR_64 + hi = count.HighPart; +#else + /* On VirtualBox, QueryPerformanceCounter does not increment + the high part every time the low part overflows. Workaround. */ + if(lo > count.LowPart) + hi++; +#endif lo = count.LowPart; return (u64)((((u64)hi << 32) | (u64)lo)*(1000000000.0/frequency.QuadPart)); @@ -91,7 +95,7 @@ LONG factor_vm::exception_handler(PEXCEPTION_POINTERS pe) case STATUS_FLOAT_UNDERFLOW: case STATUS_FLOAT_MULTIPLE_FAULTS: case STATUS_FLOAT_MULTIPLE_TRAPS: -#ifdef FACTOR_AMD64 +#ifdef FACTOR_64 signal_fpu_status = fpu_status(MXCSR(c)); #else signal_fpu_status = fpu_status(X87SW(c) | MXCSR(c)); diff --git a/vm/os-windows.cpp b/vm/os-windows.cpp index a6914a9f70..08f5932172 100755 --- a/vm/os-windows.cpp +++ b/vm/os-windows.cpp @@ -128,7 +128,7 @@ segment::~segment() long getpagesize() { static long g_pagesize = 0; - if (! g_pagesize) + if(!g_pagesize) { SYSTEM_INFO system_info; GetSystemInfo (&system_info); @@ -139,7 +139,7 @@ long getpagesize() void factor_vm::move_file(const vm_char *path1, const vm_char *path2) { - if(MoveFileEx((path1),(path2),MOVEFILE_REPLACE_EXISTING) == false) + if(MoveFileEx((path1),(path2),MOVEFILE_REPLACE_EXISTING) == false) general_error(ERROR_IO,tag_fixnum(GetLastError()),false_object,NULL); }