initial commit to nanos branch to replace micros

db4
Doug Coleman 2009-11-18 04:20:05 -06:00
parent 8800742f2b
commit b4206f5252
11 changed files with 62 additions and 0 deletions

View File

@ -514,6 +514,9 @@ M: bad-executable summary
\ micros { } { integer } define-primitive
\ micros make-flushable
\ nanos { } { integer } define-primitive
\ nanos make-flushable
\ tag { object } { fixnum } define-primitive
\ tag make-foldable

View File

@ -433,6 +433,7 @@ tuple
{ "data-room" "memory" (( -- data-room )) }
{ "code-room" "memory" (( -- code-room )) }
{ "micros" "system" (( -- us )) }
{ "nanos" "system" (( -- us )) }
{ "modify-code-heap" "compiler.units" (( alist -- )) }
{ "(dlopen)" "alien.libraries" (( path -- dll )) }
{ "(dlsym)" "alien.libraries" (( name dll -- alien )) }

View File

@ -34,4 +34,14 @@ const char *default_image_path()
return new_path;
}
u64 current_nanos()
{
struct timespec t;
int ret;
ret = clock_gettime(CLOCK_MONOTONIC,&t);
if(ret != 0)
fatal_error("clock_gettime failed", 0);
return (u64)t.tv_sec * 1000000000 + t.tv_nsec;
}
}

View File

@ -1,5 +1,6 @@
#import <Cocoa/Cocoa.h>
#include <mach/mach_time.h>
#include "master.hpp"
namespace factor
@ -84,4 +85,16 @@ Protocol *objc_getProtocol(char *name)
return nil;
}
u64 current_nanos()
{
u64 t;
mach_timebase_info_data_t info;
kern_return_t ret;
t = mach_absolute_time();
ret = mach_timebase_info(&info);
if(ret != 0)
fatal_error("mach_timebase_info failed",ret);
return t * (info.numer/info.denom);
}
}

View File

@ -52,6 +52,11 @@ void sleep_micros(cell usec)
usleep(usec);
}
void sleep_nanos(cell nsec)
{
//nanosleep(n
}
void factor_vm::init_ffi()
{
/* NULL_DLL is "libfactor.dylib" for OS X and NULL for generic unix */

View File

@ -53,6 +53,7 @@ void signal_handler(int signal, siginfo_t* siginfo, void* uap);
void dump_stack_signal(int signal, siginfo_t* siginfo, void* uap);
s64 current_micros();
u64 current_nanos();
void sleep_micros(cell usec);
void init_platform_globals();

View File

@ -36,6 +36,21 @@ s64 current_micros()
- EPOCH_OFFSET) / 10;
}
u64 current_nanos()
{
LARGE_INTEGER count;
LARGE_INTEGER frequency;
BOOL ret;
ret = QueryPerformanceCounter(&count);
if(ret == 0)
fatal_error("QueryPerformanceCounter", 0);
ret = QueryPerformanceFrequency(&frequency);
if(ret == 0)
fatal_error("QueryPerformanceFrequency", 0);
return (ulonglong)count*(1000000000/frequency);
}
LONG factor_vm::exception_handler(PEXCEPTION_POINTERS pe)
{
PEXCEPTION_RECORD e = (PEXCEPTION_RECORD)pe->ExceptionRecord;

View File

@ -131,6 +131,11 @@ void factor_vm::sleep_micros(u64 usec)
Sleep((DWORD)(usec / 1000));
}
void factor_vm::sleep_nanos(u64 nsec)
{
Sleep((DWORD)(nsec / 1000000));
}
long getpagesize()
{
static long g_pagesize = 0;

View File

@ -67,6 +67,7 @@ PRIMITIVE_FORWARD(exit)
PRIMITIVE_FORWARD(data_room)
PRIMITIVE_FORWARD(code_room)
PRIMITIVE_FORWARD(micros)
PRIMITIVE_FORWARD(nanos)
PRIMITIVE_FORWARD(modify_code_heap)
PRIMITIVE_FORWARD(dlopen)
PRIMITIVE_FORWARD(dlsym)
@ -203,6 +204,7 @@ const primitive_type primitives[] = {
primitive_data_room,
primitive_code_room,
primitive_micros,
primitive_nanos,
primitive_modify_code_heap,
primitive_dlopen,
primitive_dlsym,

View File

@ -13,6 +13,11 @@ void factor_vm::primitive_micros()
box_unsigned_8(current_micros());
}
void factor_vm::primitive_nanos()
{
box_unsigned_8(current_nanos());
}
void factor_vm::primitive_sleep()
{
sleep_micros(to_cell(dpop()));

View File

@ -118,6 +118,7 @@ struct factor_vm
// run
void primitive_exit();
void primitive_micros();
void primitive_nanos();
void primitive_sleep();
void primitive_set_slot();
@ -674,6 +675,7 @@ struct factor_vm
// os-windows
#if defined(WINDOWS)
void sleep_micros(u64 usec);
void sleep_nanos(u64 nsec);
const vm_char *vm_executable_path();
const vm_char *default_image_path();
void windows_image_path(vm_char *full_path, vm_char *temp_path, unsigned int length);