X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=src%2Fvm%2Fos.hpp;h=1f924680d4aefa6917e4f69f2f59f21dc3a0b471;hb=0a5b526074fc4c7ef3cb43496c1adc7b5a098ea9;hp=58afb59e8b357eff603c236a5e3e64f3d87b748f;hpb=a4519447c0a3f72130d62a205b0af26bdd96c6a0;p=cacao.git diff --git a/src/vm/os.hpp b/src/vm/os.hpp index 58afb59e8..1f924680d 100644 --- a/src/vm/os.hpp +++ b/src/vm/os.hpp @@ -1,6 +1,6 @@ /* src/vm/os.hpp - system (OS) functions - Copyright (C) 2007, 2008, 2009 + Copyright (C) 2007, 2008, 2009, 2010, 2011 CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO Copyright (C) 2008 Theobroma Systems Ltd. @@ -89,6 +89,16 @@ # include #endif +#if defined(__DARWIN__) +# if defined(HAVE_MACH_MACH_H) +# include +# endif +#endif + +#if defined(HAVE_SYS_LOADAVG_H) +# include +#endif + #if defined(HAVE_SYS_MMAN_H) # include #endif @@ -105,6 +115,10 @@ # include #endif +#if defined(HAVE_SYS_UTSNAME_H) +# include +#endif + #ifdef __cplusplus @@ -130,12 +144,15 @@ public: static inline void* dlsym(void* handle, const char* symbol); static inline int fclose(FILE* fp); static inline FILE* fopen(const char* path, const char* mode); - static inline int fprintf(FILE* stream, const char* format, ...); + static inline int vfprintf ( FILE * stream, const char * format, va_list arg ); static inline size_t fread(void* ptr, size_t size, size_t nmemb, FILE* stream); static inline void free(void* ptr); + static inline char* getcwd(char* buf, size_t size); static inline char* getenv(const char* name); static inline int gethostname(char* name, size_t len); + static inline int getloadavg(double loadavg[], int nelem); static inline int getpagesize(void); + static inline pid_t getpid(void); static inline int getsockname(int s, struct sockaddr* name, socklen_t* namelen); static inline int getsockopt(int s, int level, int optname, void* optval, socklen_t* optlen); static inline int listen(int sockfd, int backlog); @@ -164,9 +181,14 @@ public: static void abort(const char* text, ...); static void abort_errnum(int errnum, const char* text, ...); static void abort_errno(const char* text, ...); + static char* getcwd(void); static void* mmap_anonymous(void *addr, size_t len, int prot, int flags); static void print_backtrace(); static int processors_online(); + + // Template helper + template + static int call_scandir(int (*scandir)(const char *, struct dirent ***, _F1, _F2), const char *dir, struct dirent ***namelist, int(*filter)(const struct dirent *), int(*compar)(const void *, const void *)); }; @@ -320,16 +342,18 @@ inline FILE* os::fopen(const char* path, const char* mode) #endif } -inline int os::fprintf(FILE* stream, const char* format, ...) +//fprintf is mandatory and can't be replaced with an equivalent fast wrapper +#if !defined (HAVE_FPRINTF) +#error fprintf not available +#endif + +inline int os::vfprintf ( FILE * stream, const char * format, va_list arg ) { -#if defined(HAVE_FPRINTF) - va_list ap; - va_start(ap, format); - int result = ::vfprintf(stream, format, ap); - va_end(ap); +#if defined(HAVE_VFPRINTF) + int result = ::vfprintf(stream, format, arg); return result; #else -# error fprintf not available +# error vfprintf not available #endif } @@ -369,6 +393,15 @@ inline static int system_ftruncate(int fd, off_t length) #endif } +inline char* os::getcwd(char* buf, size_t size) +{ +#if defined(HAVE_GETCWD) + return ::getcwd(buf, size); +#else +# error getcwd not available +#endif +} + inline char* os::getenv(const char* name) { #if defined(HAVE_GETENV) @@ -387,6 +420,15 @@ inline int os::gethostname(char* name, size_t len) #endif } +inline int os::getloadavg(double loadavg[], int nelem) +{ +#if defined(HAVE_GETLOADAVG) + return ::getloadavg(loadavg, nelem); +#else +# error getloadavg not available +#endif +} + inline int os::getpagesize(void) { #if defined(HAVE_GETPAGESIZE) @@ -396,6 +438,15 @@ inline int os::getpagesize(void) #endif } +inline pid_t os::getpid(void) +{ +#if defined(HAVE_GETPID) + return ::getpid(); +#else +# error getpid not available +#endif +} + inline int os::getsockname(int s, struct sockaddr* name, socklen_t* namelen) { #if defined(HAVE_GETSOCKNAME) @@ -504,25 +555,16 @@ inline static void *system_realloc(void *ptr, size_t size) #endif } +template +inline int os::call_scandir(int (*scandir)(const char *, struct dirent ***, _F1, _F2), const char *dir, struct dirent ***namelist, int(*filter)(const struct dirent *), int(*compar)(const void *, const void *)) +{ + return scandir(dir, namelist, (_F1) filter, (_F2) compar); +} + inline int os::scandir(const char *dir, struct dirent ***namelist, int(*filter)(const struct dirent *), int(*compar)(const void *, const void *)) -/* -#elif defined(__SOLARIS__) -inline int os::scandir(const char *dir, struct dirent ***namelist, int(*filter)(const struct dirent *), int(*compar)(const struct dirent **, const struct dirent **)) -#elif defined(__IRIX__) -inline int os::scandir(const char *dir, struct dirent ***namelist, int(*filter)(dirent_t *), int(*compar)(dirent_t **, dirent_t **)) -#else -inline int os::scandir(const char *dir, struct dirent ***namelist, int(*filter)(struct dirent *), int(*compar)(const void *, const void *)) -#endif -*/ { #if defined(HAVE_SCANDIR) -# if defined(__LINUX__) - return ::scandir(dir, namelist, filter, compar); -#elif defined(__SOLARIS__) - return ::scandir(dir, namelist, filter, (int (*)(const dirent**, const dirent**)) compar); -# else - return ::scandir(dir, namelist, (int (*)(struct dirent*)) filter, compar); -# endif + return call_scandir(::scandir, dir, namelist, filter, compar); #else # error scandir not available #endif @@ -652,25 +694,10 @@ inline static ssize_t system_write(int fd, const void *buf, size_t count) void* os_mmap_anonymous(void *addr, size_t len, int prot, int flags); -void os_abort(void); -int os_access(const char* pathname, int mode); int os_atoi(const char* nptr); -void* os_calloc(size_t nmemb, size_t size); -char* os_dirname(char* path); -char* os_dlerror(void); -void* os_dlsym(void* handle, const char* symbol); -int os_fclose(FILE* fp); -FILE* os_fopen(const char* path, const char* mode); -size_t os_fread(void* ptr, size_t size, size_t nmemb, FILE* stream); -void os_free(void* ptr); int os_getpagesize(void); void* os_memcpy(void* dest, const void* src, size_t n); void* os_memset(void* s, int c, size_t n); -int os_mprotect(void* addr, size_t len, int prot); -int os_scandir(const char* dir, struct dirent*** namelist, int(*filter)(const struct dirent*), int(*compar)(const void*, const void*)); -int os_stat(const char* path, struct stat* buf); -char* os_strcat(char* dest, const char* src); -char* os_strcpy(char* dest, const char* src); char* os_strdup(const char* s); int os_strlen(const char* s);