X-Git-Url: http://git.sourceforge.jp/view?a=blobdiff_plain;f=libjava%2Fposix.cc;h=5d64094c815a19610e25a28f33bf406901dbc534;hb=76b615508c175d855f187df077ba97fbc399ce06;hp=e23eac269cc3f9074e42d99a53f852023899c621;hpb=da13fdfe7a26705b6c36bd21c315d8facf78fc8e;p=pf3gnuchains%2Fgcc-fork.git diff --git a/libjava/posix.cc b/libjava/posix.cc index e23eac269cc..5d64094c815 100644 --- a/libjava/posix.cc +++ b/libjava/posix.cc @@ -17,7 +17,12 @@ details. */ #include #include +#ifdef HAVE_DLFCN_H +#include +#endif + #include +#include #include #include #include @@ -71,7 +76,7 @@ _Jv_platform_nanotime () { #ifdef HAVE_CLOCK_GETTIME struct timespec now; - int id; + clockid_t id; #ifdef CLOCK_MONOTONIC id = CLOCK_MONOTONIC; #elif defined (CLOCK_HIGHRES) @@ -82,12 +87,20 @@ _Jv_platform_nanotime () if (clock_gettime (id, &now) == 0) { jlong result = (jlong) now.tv_sec; - result = result * 1000 * 1000 + now.tv_nsec; + result = result * 1000000000LL + now.tv_nsec; return result; } // clock_gettime failed, but we can fall through. #endif // HAVE_CLOCK_GETTIME - return _Jv_platform_gettimeofday () * 1000LL; +#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. @@ -126,6 +139,10 @@ _Jv_platform_initProperties (java::util::Properties* newprops) 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 @@ -203,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; +}