* src/native/vm/sun_misc_Unsafe.cpp (Java_sun_misc_Unsafe_getLoadAverage): Added.
authorMichael Starzinger <michi@complang.tuwien.ac.at>
Wed, 23 Sep 2009 11:45:08 +0000 (13:45 +0200)
committerMichael Starzinger <michi@complang.tuwien.ac.at>
Wed, 23 Sep 2009 11:45:08 +0000 (13:45 +0200)
* src/vm/os.hpp (os::getloadavg): Added new OS wrapper.
* configure.ac: Added check for getloadavg.

configure.ac
src/native/vm/sun_misc_Unsafe.cpp
src/vm/os.hpp

index 11d06e9ac7866a5a7425a46fefbcf8a4a1f37b46..ea2f6f684c075850b8b512aa985a4826794de167 100644 (file)
@@ -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])
index baeae5775df920f498e530639e7f62d3babf676e..7e76974657ac41983f55297edf38b74f23e6d9a8 100644 (file)
@@ -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                   },
 };
 
 
index 10da1fe9023e7e5bf3fa0a3ce4203121be69a9b7..4f92a6365c413eacc3c8c7a7b5e518a491f89035 100644 (file)
@@ -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)