X-Git-Url: http://git.sourceforge.jp/view?a=blobdiff_plain;f=libjava%2Fposix.cc;h=5d64094c815a19610e25a28f33bf406901dbc534;hb=273d05b3ed91fa47a5fb9ef16592f3d7eeb527b2;hp=1f5b037f704b0b07d53cab9e24834e498b826b87;hpb=7df0cd96aa8990365c8e32b40091fe7a637d670f;p=pf3gnuchains%2Fgcc-fork.git diff --git a/libjava/posix.cc b/libjava/posix.cc index 1f5b037f704..5d64094c815 100644 --- a/libjava/posix.cc +++ b/libjava/posix.cc @@ -1,6 +1,6 @@ // posix.cc -- Helper functions for POSIX-flavored OSs. -/* Copyright (C) 2000, 2001 Free Software Foundation +/* Copyright (C) 2000, 2001, 2002, 2006 Free Software Foundation This file is part of libgcj. @@ -12,41 +12,151 @@ details. */ #include "posix.h" +#include #include +#include +#include + +#ifdef HAVE_DLFCN_H +#include +#endif #include +#include #include #include +#include #if defined (ECOS) extern "C" unsigned long long _clock (void); #endif +#if defined(HAVE_PROC_SELF_EXE) +static char exec_name[20]; + // initialized in _Jv_platform_initialize() +#endif + +const char *_Jv_ThisExecutable (void) +{ +#if defined(DISABLE_MAIN_ARGS) + return "[Embedded App]"; +#elif defined(HAVE_PROC_SELF_EXE) + return exec_name; + // initialized in _Jv_platform_initialize() +#else + return _Jv_GetSafeArg (0); +#endif +} + // gettimeofday implementation. -void -_Jv_gettimeofday (struct timeval *tv) +jlong +_Jv_platform_gettimeofday () { #if defined (HAVE_GETTIMEOFDAY) - gettimeofday (tv, NULL); + timeval tv; + gettimeofday (&tv, NULL); + return (tv.tv_sec * 1000LL) + (tv.tv_usec / 1000LL); #elif defined (HAVE_TIME) - tv->tv_sec = time (NULL); - tv->tv_usec = 0; + return time (NULL) * 1000LL; #elif defined (HAVE_FTIME) struct timeb t; ftime (&t); - tv->tv_sec = t.time; - tv->tv_usec = t.millitm * 1000; + return (t.time * 1000LL) + t.millitm; #elif defined (ECOS) // FIXME. - tv->tv_sec = _clock () / 1000; - tv->tv_usec = 0; + return _clock(); #else // In the absence of any function, time remains forever fixed. - tv->tv_sec = 23; - tv->tv_usec = 0; + return 23000; +#endif +} + +jlong +_Jv_platform_nanotime () +{ +#ifdef HAVE_CLOCK_GETTIME + struct timespec now; + clockid_t id; +#ifdef CLOCK_MONOTONIC + id = CLOCK_MONOTONIC; +#elif defined (CLOCK_HIGHRES) + id = CLOCK_HIGHRES; +#else + id = CLOCK_REALTIME; +#endif + if (clock_gettime (id, &now) == 0) + { + jlong result = (jlong) now.tv_sec; + result = result * 1000000000LL + now.tv_nsec; + return result; + } + // clock_gettime failed, but we can fall through. +#endif // HAVE_CLOCK_GETTIME +#if defined (HAVE_GETTIMEOFDAY) + { + timeval tv; + gettimeofday (&tv, NULL); + return (tv.tv_sec * 1000000000LL) + tv.tv_usec * 1000LL; + } +#else + return _Jv_platform_gettimeofday () * 1000000LL; +#endif +} + +// Platform-specific VM initialization. +void +_Jv_platform_initialize (void) +{ +#if defined (HAVE_SIGACTION) + // We only want this on POSIX systems. + struct sigaction act; + act.sa_handler = SIG_IGN; + sigemptyset (&act.sa_mask); + act.sa_flags = 0; + sigaction (SIGPIPE, &act, NULL); +#else + signal (SIGPIPE, SIG_IGN); +#endif + +#if defined (HAVE_PROC_SELF_EXE) + // Compute our executable name + sprintf (exec_name, "/proc/%d/exe", getpid ()); #endif } +// Set platform-specific System properties. +void +_Jv_platform_initProperties (java::util::Properties* newprops) +{ + // A convenience define. +#define SET(Prop,Val) \ + newprops->put(JvNewStringLatin1 (Prop), JvNewStringLatin1 (Val)) + + SET ("file.separator", "/"); + SET ("path.separator", ":"); + SET ("line.separator", "\n"); + const char *tmpdir = ::getenv("TMPDIR"); + if (! tmpdir) + tmpdir = "/tmp"; + SET ("java.io.tmpdir", tmpdir); + const char *zoneinfodir = ::getenv("TZDATA"); + if (! zoneinfodir) + zoneinfodir = "/usr/share/zoneinfo"; + SET ("gnu.java.util.zoneinfo.dir", zoneinfodir); +} + +static inline void +internal_gettimeofday (struct timeval *result) +{ +#if defined (HAVE_GETTIMEOFDAY) + gettimeofday (result, NULL); +#else + jlong val = _Jv_platform_gettimeofday (); + result->tv_sec = val / 1000; + result->tv_usec = (val % 1000) * 1000; +#endif /* HAVE_GETTIMEOFDAY */ +} + // A wrapper for select() which ignores EINTR. int _Jv_select (int n, fd_set *readfds, fd_set *writefds, @@ -57,7 +167,7 @@ _Jv_select (int n, fd_set *readfds, fd_set *writefds, struct timeval end, delay; if (timeout) { - _Jv_gettimeofday (&end); + internal_gettimeofday (&end); end.tv_usec += timeout->tv_usec; if (end.tv_usec >= 1000000) { @@ -87,7 +197,7 @@ _Jv_select (int n, fd_set *readfds, fd_set *writefds, struct timeval after; if (timeout) { - _Jv_gettimeofday (&after); + internal_gettimeofday (&after); // Now compute new timeout argument. delay.tv_usec = end.tv_usec - after.tv_usec; delay.tv_sec = end.tv_sec - after.tv_sec; @@ -110,3 +220,31 @@ _Jv_select (int n, fd_set *readfds, fd_set *writefds, return 0; #endif } + +// Given an address, find the object that defines it and the nearest +// defined symbol to that address. Returns 0 if no object defines this +// address. +int +_Jv_platform_dladdr (void *addr, _Jv_AddrInfo *info) +{ + int ret_val = 0; + +#if defined (HAVE_DLFCN_H) && defined (HAVE_DLADDR) + Dl_info addr_info; + ret_val = dladdr (addr, &addr_info); + if (ret_val != 0) + { + info->file_name = addr_info.dli_fname; + info->base = addr_info.dli_fbase; + info->sym_name = addr_info.dli_sname; + info->sym_addr = addr_info.dli_saddr; + } +#else + info->file_name = NULL; + info->base = NULL; + info->sym_name = NULL; + info->sym_addr = NULL; +#endif + + return ret_val; +}