From: Michael Starzinger Date: Wed, 23 Sep 2009 11:45:08 +0000 (+0200) Subject: * src/native/vm/sun_misc_Unsafe.cpp (Java_sun_misc_Unsafe_getLoadAverage): Added. X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=commitdiff_plain;h=8a7af97012be283284be8e84da18fe85b59e274a;hp=7393753e3a67c410b8741ed130422bdfbdc90f69;p=cacao.git * src/native/vm/sun_misc_Unsafe.cpp (Java_sun_misc_Unsafe_getLoadAverage): Added. * src/vm/os.hpp (os::getloadavg): Added new OS wrapper. * configure.ac: Added check for getloadavg. --- diff --git a/configure.ac b/configure.ac index 11d06e9ac..ea2f6f684 100644 --- a/configure.ac +++ b/configure.ac @@ -344,6 +344,7 @@ AC_CHECK_FUNCS([getcwd]) AC_CHECK_FUNCS([getenv]) AC_CHECK_FUNCS([gethostbyname]) AC_CHECK_FUNCS([gethostname]) +AC_CHECK_FUNCS([getloadavg]) AC_CHECK_FUNCS([getpagesize]) AC_CHECK_FUNCS([getrusage]) AC_CHECK_FUNCS([getsockname]) diff --git a/src/native/vm/sun_misc_Unsafe.cpp b/src/native/vm/sun_misc_Unsafe.cpp index baeae5775..7e7697465 100644 --- a/src/native/vm/sun_misc_Unsafe.cpp +++ b/src/native/vm/sun_misc_Unsafe.cpp @@ -1157,6 +1157,36 @@ JNIEXPORT void JNICALL Java_sun_misc_Unsafe_park(JNIEnv *env, jobject _this, jbo threads_park(isAbsolute, time); } + +/* + * Class: sun/misc/Unsafe + * Method: getLoadAverage + * Signature: ([DI)I + */ +JNIEXPORT jint JNICALL Java_sun_misc_Unsafe_getLoadAverage(JNIEnv *env, jobject _this, jdoubleArray loadavg, jint nelem) +{ + DoubleArray da(loadavg); + +#define MAX_SAMPLES 3 + + // Check the passed number of samples. + if ((nelem < 0) || (nelem > da.get_length()) || nelem > MAX_SAMPLES) { + exceptions_throw_arrayindexoutofboundsexception(); + return -1; + } + + // Actually retrieve samples. + double values[MAX_SAMPLES]; + int result = os::getloadavg(values, nelem); + + // Save samples into the given array. + for (int i = 0; i < result; i++) { + da.set_element(i, values[i]); + } + + return result; +} + } // extern "C" @@ -1235,6 +1265,7 @@ static JNINativeMethod methods[] = { { (char*) "putOrderedLong", (char*) "(Ljava/lang/Object;JJ)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_putOrderedLong }, { (char*) "unpark", (char*) "(Ljava/lang/Object;)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_unpark }, { (char*) "park", (char*) "(ZJ)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_park }, + { (char*) "getLoadAverage", (char*) "([DI)I", (void*) (uintptr_t) &Java_sun_misc_Unsafe_getLoadAverage }, }; diff --git a/src/vm/os.hpp b/src/vm/os.hpp index 10da1fe90..4f92a6365 100644 --- a/src/vm/os.hpp +++ b/src/vm/os.hpp @@ -135,6 +135,7 @@ public: static inline void free(void* ptr); 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 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); @@ -391,6 +392,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)