From 1861dd2705c43e5c0f57b68657fedd16437b747d Mon Sep 17 00:00:00 2001 From: Doug Coleman Date: Wed, 18 Nov 2009 04:20:05 -0600 Subject: [PATCH] initial commit to nanos branch to replace micros --- .../stack-checker/known-words/known-words.factor | 3 +++ core/bootstrap/primitives.factor | 1 + vm/os-genunix.cpp | 10 ++++++++++ vm/os-macosx.mm | 13 +++++++++++++ vm/os-unix.cpp | 5 +++++ vm/os-unix.hpp | 1 + vm/os-windows-nt.cpp | 15 +++++++++++++++ vm/os-windows.cpp | 5 +++++ vm/primitives.cpp | 2 ++ vm/run.cpp | 5 +++++ vm/vm.hpp | 2 ++ 11 files changed, 62 insertions(+) diff --git a/basis/stack-checker/known-words/known-words.factor b/basis/stack-checker/known-words/known-words.factor index 3be5244231..d45b54bd23 100644 --- a/basis/stack-checker/known-words/known-words.factor +++ b/basis/stack-checker/known-words/known-words.factor @@ -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 diff --git a/core/bootstrap/primitives.factor b/core/bootstrap/primitives.factor index ca9056805e..072f41c086 100644 --- a/core/bootstrap/primitives.factor +++ b/core/bootstrap/primitives.factor @@ -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 )) } diff --git a/vm/os-genunix.cpp b/vm/os-genunix.cpp index 065f0dfd40..ff63988915 100644 --- a/vm/os-genunix.cpp +++ b/vm/os-genunix.cpp @@ -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; +} + } diff --git a/vm/os-macosx.mm b/vm/os-macosx.mm index 438957bd04..fa13d8fd15 100644 --- a/vm/os-macosx.mm +++ b/vm/os-macosx.mm @@ -1,5 +1,6 @@ #import +#include #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); +} + } diff --git a/vm/os-unix.cpp b/vm/os-unix.cpp index cd88541136..63d68e2787 100644 --- a/vm/os-unix.cpp +++ b/vm/os-unix.cpp @@ -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 */ diff --git a/vm/os-unix.hpp b/vm/os-unix.hpp index 05ab8b1120..52a3bd8676 100644 --- a/vm/os-unix.hpp +++ b/vm/os-unix.hpp @@ -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(); diff --git a/vm/os-windows-nt.cpp b/vm/os-windows-nt.cpp index 0c5ddd99e1..cdb0dad350 100755 --- a/vm/os-windows-nt.cpp +++ b/vm/os-windows-nt.cpp @@ -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; diff --git a/vm/os-windows.cpp b/vm/os-windows.cpp index 48745584d3..773e40fbba 100755 --- a/vm/os-windows.cpp +++ b/vm/os-windows.cpp @@ -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; diff --git a/vm/primitives.cpp b/vm/primitives.cpp index b566696ae7..ed877cb645 100644 --- a/vm/primitives.cpp +++ b/vm/primitives.cpp @@ -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, diff --git a/vm/run.cpp b/vm/run.cpp index 59375df1fb..81f155c57e 100755 --- a/vm/run.cpp +++ b/vm/run.cpp @@ -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())); diff --git a/vm/vm.hpp b/vm/vm.hpp index c1f7fdb129..f96777613a 100755 --- a/vm/vm.hpp +++ b/vm/vm.hpp @@ -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);