\ micros { } { integer } define-primitive
\ micros make-flushable
+\ nanos { } { integer } define-primitive
+\ nanos make-flushable
+
\ tag { object } { fixnum } define-primitive
\ tag make-foldable
{ "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 )) }
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;
+}
+
}
#import <Cocoa/Cocoa.h>
+#include <mach/mach_time.h>
#include "master.hpp"
namespace factor
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);
+}
+
}
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 */
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();
- 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;
Sleep((DWORD)(usec / 1000));
}
+void factor_vm::sleep_nanos(u64 nsec)
+{
+ Sleep((DWORD)(nsec / 1000000));
+}
+
long getpagesize()
{
static long g_pagesize = 0;
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)
primitive_data_room,
primitive_code_room,
primitive_micros,
+ primitive_nanos,
primitive_modify_code_heap,
primitive_dlopen,
primitive_dlsym,
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()));
// run
void primitive_exit();
void primitive_micros();
+ void primitive_nanos();
void primitive_sleep();
void primitive_set_slot();
// 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);