vm: disable silly nano-count workaround on Win64, fix some indentation issues

db4
Slava Pestov 2010-02-06 00:45:06 -06:00
parent d5a25f99bf
commit c08fa9cb6e
3 changed files with 26 additions and 29 deletions

View File

@ -154,7 +154,7 @@ void factor_vm::primitive_fopen()
FILE *file; FILE *file;
file = safe_fopen((char *)(path.untagged() + 1), file = safe_fopen((char *)(path.untagged() + 1),
(char *)(mode.untagged() + 1)); (char *)(mode.untagged() + 1));
ctx->push(allot_alien(file)); ctx->push(allot_alien(file));
} }
@ -187,31 +187,24 @@ void factor_vm::primitive_fread()
data_root<byte_array> buf(allot_uninitialized_array<byte_array>(size),this); data_root<byte_array> buf(allot_uninitialized_array<byte_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(feof(file))
if(c == 0) ctx->push(false_object);
{
if(feof(file))
{
ctx->push(false_object);
break;
}
else
io_error();
}
else 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);
byte_array *new_buf = allot_byte_array(c); buf = new_buf;
memcpy(new_buf + 1, buf.untagged() + 1,c);
buf = new_buf;
}
ctx->push(buf.value());
break;
} }
ctx->push(buf.value());
} }
} }

View File

@ -37,8 +37,6 @@ u64 system_micros()
- EPOCH_OFFSET) / 10; - EPOCH_OFFSET) / 10;
} }
/* On VirtualBox, QueryPerformanceCounter does not increment
the high part every time the low part overflows. Workaround. */
u64 nano_count() u64 nano_count()
{ {
LARGE_INTEGER count; LARGE_INTEGER count;
@ -53,8 +51,14 @@ u64 nano_count()
if(ret == 0) if(ret == 0)
fatal_error("QueryPerformanceFrequency", 0); fatal_error("QueryPerformanceFrequency", 0);
if(count.LowPart < lo) #ifdef FACTOR_64
hi += 1; 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; lo = count.LowPart;
return (u64)((((u64)hi << 32) | (u64)lo)*(1000000000.0/frequency.QuadPart)); 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_UNDERFLOW:
case STATUS_FLOAT_MULTIPLE_FAULTS: case STATUS_FLOAT_MULTIPLE_FAULTS:
case STATUS_FLOAT_MULTIPLE_TRAPS: case STATUS_FLOAT_MULTIPLE_TRAPS:
#ifdef FACTOR_AMD64 #ifdef FACTOR_64
signal_fpu_status = fpu_status(MXCSR(c)); signal_fpu_status = fpu_status(MXCSR(c));
#else #else
signal_fpu_status = fpu_status(X87SW(c) | MXCSR(c)); signal_fpu_status = fpu_status(X87SW(c) | MXCSR(c));

View File

@ -128,7 +128,7 @@ segment::~segment()
long getpagesize() long getpagesize()
{ {
static long g_pagesize = 0; static long g_pagesize = 0;
if (! g_pagesize) if(!g_pagesize)
{ {
SYSTEM_INFO system_info; SYSTEM_INFO system_info;
GetSystemInfo (&system_info); GetSystemInfo (&system_info);
@ -139,7 +139,7 @@ long getpagesize()
void factor_vm::move_file(const vm_char *path1, const vm_char *path2) 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); general_error(ERROR_IO,tag_fixnum(GetLastError()),false_object,NULL);
} }