]> gitweb.factorcode.org Git - factor.git/commitdiff
initial commit to nanos branch to replace micros
authorDoug Coleman <doug.coleman@gmail.com>
Wed, 18 Nov 2009 10:20:05 +0000 (04:20 -0600)
committerDoug Coleman <doug.coleman@gmail.com>
Wed, 18 Nov 2009 10:20:05 +0000 (04:20 -0600)
basis/stack-checker/known-words/known-words.factor
core/bootstrap/primitives.factor
vm/os-genunix.cpp
vm/os-macosx.mm
vm/os-unix.cpp
vm/os-unix.hpp
vm/os-windows-nt.cpp
vm/os-windows.cpp
vm/primitives.cpp
vm/run.cpp
vm/vm.hpp

index 3be5244231278bb03cef5f1daabbbb6cff326a81..d45b54bd2394abdd8ba83726937f90a06cd8b8df 100644 (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
 
index ca9056805e18bf364ee63827598c36560a527a8d..072f41c0868e3dbc16d9a555b57dcb7f976cded1 100644 (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 )) }
index 065f0dfd4094174d49603976bedac5ad43359fdc..ff63988915613f1cfb9c2aecc73d66a3b6be8fc1 100644 (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;
+}
+
 }
index 438957bd047ff2c765b3a2d75d5bff0f537cb814..fa13d8fd15b67ebbd58dbd6f004c1baab2e21402 100644 (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);
+}
+
 }
index cd885411369fc83c6b4715e4f349b60442edca82..63d68e27873a7c7f17b1e226dd0c6a5ccf61066b 100644 (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 */
index 05ab8b1120e3a4f29219aadb8d3d307074bd7882..52a3bd8676ac7bc2874f566e41a0568c397589db 100644 (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();
index 0c5ddd99e19b40ae46eebe4e8606e78243cf0e79..cdb0dad35025ccf52a9b0fd2734fb2059882f4c5 100755 (executable)
@@ -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;
index 48745584d3c29ee8d4513e635cdfff08a4b0975c..773e40fbbac30069a2b0570363c43123c2acfff3 100755 (executable)
@@ -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;
index b566696ae7eec9b23d37354a7c0c56973b5744dc..ed877cb6450563f04e9a1d487160889282bcb99e 100644 (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,
index 59375df1fbd6e00d4ae66166f304843774419506..81f155c57e9e1d23a2d6f482573719e418828d63 100755 (executable)
@@ -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()));
index c1f7fdb1295ce8319fdbe877484ca83172fb2e87..f96777613a9fccbdacf0e20346cf0a68de5f7221 100755 (executable)
--- 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);