#include <dlfcn.h>
#include <signal.h>
#include <pthread.h>
+#include <sched.h>
+#include "atomic-gcc.hpp"
-namespace factor
-{
+namespace factor {
typedef char vm_char;
typedef char symbol_char;
#define STRNCMP strncmp
#define STRDUP strdup
+#define FTELL ftello
#define FSEEK fseeko
-#define FIXNUM_FORMAT "%ld"
-#define CELL_FORMAT "%lu"
-#define CELL_HEX_FORMAT "%lx"
+#define OPEN_READ(path) fopen(path, "rb")
+#define OPEN_WRITE(path) fopen(path, "wb")
-#ifdef FACTOR_64
- #define CELL_HEX_PAD_FORMAT "%016lx"
-#else
- #define CELL_HEX_PAD_FORMAT "%08lx"
+#ifdef _GNU_SOURCE
+extern "C" {
+ extern int __xpg_strerror_r (int __errnum, char *__buf, size_t __buflen);
+}
+#define strerror_r __xpg_strerror_r
#endif
-#define FIXNUM_FORMAT "%ld"
-
-#define OPEN_READ(path) fopen(path,"rb")
-#define OPEN_WRITE(path) fopen(path,"wb")
+#define THREADSAFE_STRERROR(errnum, buf, buflen) strerror_r(errnum, buf, buflen)
#define print_native_string(string) print_string(string)
-void start_thread(void *(*start_routine)(void *));
+typedef pthread_t THREADHANDLE;
-void init_ffi();
-void ffi_dlopen(dll *dll);
-void *ffi_dlsym(dll *dll, symbol_char *symbol);
-void ffi_dlclose(dll *dll);
+THREADHANDLE start_thread(void* (*start_routine)(void*), void* args);
+inline static THREADHANDLE thread_id() { return pthread_self(); }
-void unix_init_signals();
-void signal_handler(int signal, siginfo_t* siginfo, void* uap);
-void dump_stack_signal(int signal, siginfo_t* siginfo, void* uap);
+uint64_t nano_count();
+void sleep_nanos(uint64_t nsec);
-s64 current_micros();
-void sleep_micros(cell usec);
+void check_ENOMEM(const char* msg);
-void open_console();
+static inline void breakpoint() { __builtin_trap(); }
-#define SIGNAL_VM_PTR vm
+#define AS_UTF8(ptr) ptr
}