From f98a009234b7672b17104e1b76f0aa6c2039f0eb Mon Sep 17 00:00:00 2001 From: Michael Starzinger Date: Thu, 24 Sep 2009 16:56:02 +0200 Subject: [PATCH] * src/vm/javaobjects.cpp (java_lang_management_MemoryUsage): Added new constructor for MemoryUsage objects. * src/vm/javaobjects.hpp (java_lang_management_MemoryUsage): Added accessor. * src/native/vm/gnuclasspath/gnu_java_lang_management_VMClassLoadingMXBeanImpl.cpp, * src/native/vm/gnuclasspath/gnu_java_lang_management_VMMemoryMXBeanImpl.cpp: Fixed broken methods and use above invocation wrapper now. --- ...ng_management_VMClassLoadingMXBeanImpl.cpp | 17 +++-- ...ava_lang_management_VMMemoryMXBeanImpl.cpp | 63 ++++--------------- src/vm/javaobjects.cpp | 32 ++++++++++ src/vm/javaobjects.hpp | 15 +++++ 4 files changed, 67 insertions(+), 60 deletions(-) diff --git a/src/native/vm/gnuclasspath/gnu_java_lang_management_VMClassLoadingMXBeanImpl.cpp b/src/native/vm/gnuclasspath/gnu_java_lang_management_VMClassLoadingMXBeanImpl.cpp index c00c3e9a4..edf439da8 100644 --- a/src/native/vm/gnuclasspath/gnu_java_lang_management_VMClassLoadingMXBeanImpl.cpp +++ b/src/native/vm/gnuclasspath/gnu_java_lang_management_VMClassLoadingMXBeanImpl.cpp @@ -39,6 +39,7 @@ #include "toolbox/logging.hpp" #include "vm/classcache.hpp" +#include "vm/options.h" #include "vm/utf8.h" #include "vm/vm.hpp" @@ -68,9 +69,12 @@ JNIEXPORT jint JNICALL Java_gnu_java_lang_management_VMClassLoadingMXBeanImpl_ge */ JNIEXPORT jlong JNICALL Java_gnu_java_lang_management_VMClassLoadingMXBeanImpl_getUnloadedClassCount(JNIEnv *env, jclass clazz) { - log_println("Java_gnu_java_lang_management_VMClassLoadingMXBeanImpl_getUnloadedClassCount: IMPLEMENT ME!"); + int32_t count; + + // XXX Fix this once we support class unloading! + count = 0; - return 0; + return count; } @@ -81,10 +85,7 @@ JNIEXPORT jlong JNICALL Java_gnu_java_lang_management_VMClassLoadingMXBeanImpl_g */ JNIEXPORT jboolean JNICALL Java_gnu_java_lang_management_VMClassLoadingMXBeanImpl_isVerbose(JNIEnv *env, jclass clazz) { -/* return _Jv_jvm->Java_gnu_java_lang_management_VMClassLoadingMXBeanImpl_verbose; */ -#warning Move to C++ - log_println("Java_gnu_java_lang_management_VMClassLoadingMXBeanImpl_isVerbose: MOVE TO C++!"); - return 0; + return opt_verboseclass; } @@ -95,9 +96,7 @@ JNIEXPORT jboolean JNICALL Java_gnu_java_lang_management_VMClassLoadingMXBeanImp */ JNIEXPORT void JNICALL Java_gnu_java_lang_management_VMClassLoadingMXBeanImpl_setVerbose(JNIEnv *env, jclass clazz, jboolean verbose) { -/* _Jv_jvm->Java_gnu_java_lang_management_VMClassLoadingMXBeanImpl_verbose = verbose; */ -#warning Move to C++ - log_println("Java_gnu_java_lang_management_VMClassLoadingMXBeanImpl_setVerbose: MOVE TO C++!"); + opt_verboseclass = verbose; } } // extern "C" diff --git a/src/native/vm/gnuclasspath/gnu_java_lang_management_VMMemoryMXBeanImpl.cpp b/src/native/vm/gnuclasspath/gnu_java_lang_management_VMMemoryMXBeanImpl.cpp index 96a848d11..55952ab68 100644 --- a/src/native/vm/gnuclasspath/gnu_java_lang_management_VMMemoryMXBeanImpl.cpp +++ b/src/native/vm/gnuclasspath/gnu_java_lang_management_VMMemoryMXBeanImpl.cpp @@ -36,10 +36,9 @@ # include "native/vm/include/gnu_java_lang_management_VMMemoryMXBeanImpl.h" #endif -#include "vm/jit/builtin.hpp" #include "vm/class.hpp" #include "vm/global.h" -#include "vm/loader.hpp" /* XXX only for load_class_bootstrap */ +#include "vm/javaobjects.hpp" #include "vm/options.h" #include "vm/vm.hpp" @@ -54,50 +53,17 @@ extern "C" { */ JNIEXPORT jobject JNICALL Java_gnu_java_lang_management_VMMemoryMXBeanImpl_getHeapMemoryUsage(JNIEnv *env, jclass clazz) { - classinfo *class_java_lang_management_MemoryUsage; - java_handle_t *o; - methodinfo *m; - int64_t init; - int64_t used; - int64_t commited; - int64_t maximum; + // Get values from the VM. + // XXX If we ever support more than one VM, change this. + int64_t init = opt_heapstartsize; + int64_t used = gc_get_total_bytes(); + int64_t commited = gc_get_heap_size(); + int64_t maximum = gc_get_max_heap_size(); - /* get the class */ - /* XXX optimize me! sometime... */ + // Construct a new java.lang.management.MemoryUsage object. + java_lang_management_MemoryUsage jlmmu(init, used, commited, maximum); - if (!(class_java_lang_management_MemoryUsage = load_class_bootstrap(utf_new_char("java/lang/management/MemoryUsage")))) - return false; - - /* create the object */ - - o = builtin_new(class_java_lang_management_MemoryUsage); - - if (o == NULL) - return NULL; - - /* find initializer */ - - m = class_findmethod(class_java_lang_management_MemoryUsage, - utf_init, utf_new_char("(JJJJ)V")); - - /* initializer not found */ - - if (m == NULL) - return NULL; - - /* get values from the VM */ - /* XXX if we ever support more than one VM, change this */ - - init = opt_heapstartsize; - used = gc_get_total_bytes(); - commited = gc_get_heap_size(); - maximum = gc_get_max_heap_size(); - - /* call initializer */ - - (void) vm_call_method(m, o, init, used, commited, maximum); - - return (jobject) o; + return jlmmu.get_handle(); } @@ -134,10 +100,7 @@ JNIEXPORT jint JNICALL Java_gnu_java_lang_management_VMMemoryMXBeanImpl_getObjec */ JNIEXPORT jboolean JNICALL Java_gnu_java_lang_management_VMMemoryMXBeanImpl_isVerbose(JNIEnv *env, jclass clazz) { -/* return _Jv_jvm->Java_gnu_java_lang_management_VMMemoryMXBeanImpl_verbose; */ -#warning Move to C++ - log_println("Java_gnu_java_lang_management_VMMemoryMXBeanImpl_isVerbose: MOVE TO C++!"); - return 0; + return opt_verbosegc; } @@ -148,9 +111,7 @@ JNIEXPORT jboolean JNICALL Java_gnu_java_lang_management_VMMemoryMXBeanImpl_isVe */ JNIEXPORT void JNICALL Java_gnu_java_lang_management_VMMemoryMXBeanImpl_setVerbose(JNIEnv *env, jclass clazz, jboolean verbose) { -/* _Jv_jvm->Java_gnu_java_lang_management_VMMemoryMXBeanImpl_verbose = verbose; */ -#warning Move to C++ - log_println("Java_gnu_java_lang_management_VMMemoryMXBeanImpl_setVerbose: MOVE TO C++!"); + opt_verbosegc = verbose; } } // extern "C" diff --git a/src/vm/javaobjects.cpp b/src/vm/javaobjects.cpp index 901756534..2bd0a19dd 100644 --- a/src/vm/javaobjects.cpp +++ b/src/vm/javaobjects.cpp @@ -74,6 +74,38 @@ java_handle_t* java_lang_ClassLoader::invoke_getSystemClassLoader() } +/** + * Constructs a new instance of the class by calling the + * appropriate Java initializer. + */ +java_lang_management_MemoryUsage::java_lang_management_MemoryUsage(int64_t init, int64_t used, int64_t commited, int64_t maximum) +{ + // Load the class. + // XXX Maybe this should be made global at some points. + classinfo* class_java_lang_management_MemoryUsage; + if (!(class_java_lang_management_MemoryUsage = load_class_bootstrap(utf_new_char("java/lang/management/MemoryUsage")))) + return; + + // Find the appropriate initializer. + // XXX Maybe this should be made global at some points. + methodinfo* m = class_findmethod(class_java_lang_management_MemoryUsage, + utf_init, + utf_new_char("(JJJJ)V")); + + if (m == NULL) + return; + + // Instantiate a new object. + _handle = builtin_new(class_java_lang_management_MemoryUsage); + + if (is_null()) + return; + + // Call initializer. + (void) vm_call_method(m, _handle, init, used, commited, maximum); +} + + /** * Constructs a Java object with the given * java.lang.reflect.Constructor. diff --git a/src/vm/javaobjects.hpp b/src/vm/javaobjects.hpp index 71f58abb1..199fa8b61 100644 --- a/src/vm/javaobjects.hpp +++ b/src/vm/javaobjects.hpp @@ -509,6 +509,21 @@ inline void java_lang_Double::set_value(double value) #if defined(ENABLE_JAVASE) +/** + * java/lang/management/MemoryUsage + * + * Object layout: + * + * 0. object header + * [other fields are not used] + */ +class java_lang_management_MemoryUsage : public java_lang_Object, private FieldAccess { +public: + java_lang_management_MemoryUsage(java_handle_t* h) : java_lang_Object(h) {} + java_lang_management_MemoryUsage(int64_t init, int64_t used, int64_t commited, int64_t maximum); +}; + + # if defined(ENABLE_ANNOTATIONS) /** * OpenJDK sun/reflect/ConstantPool -- 2.25.1