| //===------ ClasspathVMRuntime.cpp - GNU classpath java/lang/VMRuntime ----===// |
| // |
| // The VMKit project |
| // |
| // This file is distributed under the University of Illinois Open Source |
| // License. See LICENSE.TXT for details. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| |
| #include "VmkitGC.h" |
| |
| #include "types.h" |
| |
| #include "Classpath.h" |
| #include "JavaArray.h" |
| #include "JavaClass.h" |
| #include "JavaObject.h" |
| #include "JavaString.h" |
| #include "JavaThread.h" |
| #include "JavaUpcalls.h" |
| #include "Jnjvm.h" |
| |
| #include <cstring> |
| #include <unistd.h> |
| |
| using namespace j3; |
| |
| extern "C" { |
| |
| |
| JNIEXPORT JavaObject* JNICALL Java_java_lang_VMRuntime_mapLibraryName( |
| #ifdef NATIVE_JNI |
| JNIEnv *env, |
| jclass clazz, |
| #endif |
| JavaString* strLib) { |
| |
| JavaObject* res = 0; |
| ArrayUInt16* array = 0; |
| const ArrayUInt16* utf8Lib = 0; |
| llvm_gcroot(res, 0); |
| llvm_gcroot(array, 0); |
| llvm_gcroot(utf8Lib, 0); |
| llvm_gcroot(strLib, 0); |
| |
| BEGIN_NATIVE_EXCEPTION(0) |
| |
| Jnjvm* vm = JavaThread::get()->getJVM(); |
| |
| utf8Lib = JavaString::getValue(strLib); |
| uint32 stLib = strLib->offset; |
| sint32 lgLib = strLib->count; |
| sint32 lgPre = vm->bootstrapLoader->prelib->size; |
| sint32 lgPost = vm->bootstrapLoader->postlib->size; |
| |
| uint32 size = (uint32)(lgPre + lgLib + lgPost); |
| array = (ArrayUInt16*)vm->upcalls->ArrayOfChar->doNew(size, vm); |
| uint16* elements = ArrayUInt16::getElements(array); |
| |
| memmove(elements, vm->bootstrapLoader->prelib->elements, |
| lgPre * sizeof(uint16)); |
| memmove(&(elements[lgPre]), ArrayUInt16::getElements(utf8Lib) + stLib, |
| lgLib * sizeof(uint16)); |
| memmove(&(elements[lgPre + lgLib]), vm->bootstrapLoader->postlib->elements, |
| lgPost * sizeof(uint16)); |
| |
| res = vm->constructString(array); |
| |
| END_NATIVE_EXCEPTION |
| |
| return res; |
| |
| } |
| |
| typedef int (*onLoad_t)(const void**, void*); |
| extern "C" void j3EndJNI(uint32** old); |
| extern "C" void j3StartJNI(uint32* num, uint32** old, vmkit::KnownFrame* Frame); |
| |
| extern "C" void callOnLoad(void* res, JnjvmClassLoader* loader, Jnjvm* vm) |
| __attribute__ ((noinline)); |
| |
| extern "C" int doCall(onLoad_t func, void* res, Jnjvm* vm) |
| __attribute__ ((noinline)); |
| |
| extern "C" int doCall(onLoad_t func, void* res, Jnjvm* vm) { |
| func(&vm->javavmEnv, res); |
| return 1; |
| } |
| |
| // Calls the JNI_OnLoad function of a dynamic library. |
| extern "C" void callOnLoad(void* res, JnjvmClassLoader* loader, Jnjvm* vm) { |
| |
| onLoad_t onLoad = (onLoad_t)loader->loadInLib("JNI_OnLoad", res); |
| |
| if (onLoad) { |
| uint32 num = 0; |
| uint32* old = 0; |
| vmkit::KnownFrame Frame; |
| |
| j3StartJNI(&num, &old, &Frame); |
| doCall(onLoad, res, vm); |
| j3EndJNI(&old); |
| } |
| } |
| |
| // Never throws. |
| JNIEXPORT jint JNICALL Java_java_lang_VMRuntime_nativeLoad( |
| #ifdef NATIVE_JNI |
| JNIEnv *env, |
| jclass clazz, |
| #endif |
| JavaString* str, |
| JavaObject* javaLoader) { |
| |
| |
| llvm_gcroot(str, 0); |
| llvm_gcroot(javaLoader, 0); |
| |
| void* res = 0; |
| |
| BEGIN_NATIVE_EXCEPTION(0) |
| |
| Jnjvm* vm = JavaThread::get()->getJVM(); |
| JnjvmClassLoader* loader = |
| JnjvmClassLoader::getJnjvmLoaderFromJavaObject(javaLoader, vm); |
| |
| vmkit::ThreadAllocator allocator; |
| char* buf = JavaString::strToAsciiz(str, &allocator); |
| |
| res = loader->loadLib(buf); |
| |
| if (res) callOnLoad(res, loader, vm); |
| |
| END_NATIVE_EXCEPTION |
| |
| return res != 0; |
| } |
| |
| |
| JNIEXPORT void JNICALL Java_java_lang_VMRuntime_gc( |
| #ifdef NATIVE_JNI |
| JNIEnv *env, |
| jclass clazz, |
| #endif |
| ) { |
| BEGIN_NATIVE_EXCEPTION(0) |
| |
| vmkit::Collector::collect(); |
| |
| END_NATIVE_EXCEPTION |
| } |
| |
| JNIEXPORT void JNICALL Java_java_lang_VMRuntime_runFinalization( |
| #ifdef NATIVE_JNI |
| JNIEnv *env, |
| jclass clazz, |
| #endif |
| ) { |
| vmkit::Collector::collect(); |
| // Sleep a bit. |
| sleep(1); |
| return; |
| } |
| |
| JNIEXPORT void JNICALL Java_java_lang_VMRuntime_runFinalizationForExit( |
| #ifdef NATIVE_JNI |
| JNIEnv *env, |
| jclass clazz, |
| #endif |
| ) { |
| return; |
| } |
| |
| JNIEXPORT void JNICALL Java_java_lang_VMRuntime_runFinalizersOnExit( |
| #ifdef NATIVE_JNI |
| JNIEnv *env, |
| jclass clazz, |
| #endif |
| uint8 value |
| ) { |
| return; |
| } |
| |
| JNIEXPORT void JNICALL Java_java_lang_VMRuntime_exit( |
| #ifdef NATIVE_JNI |
| JNIEnv *env, |
| jclass clazz, |
| #endif |
| jint par1) { |
| vmkit::System::Exit(par1); |
| } |
| |
| JNIEXPORT jlong Java_java_lang_VMRuntime_freeMemory( |
| #ifdef NATIVE_JNI |
| JNIEnv *env, |
| jclass clazz, |
| #endif |
| ) { |
| return (jlong)vmkit::Collector::getFreeMemory(); |
| } |
| |
| JNIEXPORT jlong Java_java_lang_VMRuntime_totalMemory( |
| #ifdef NATIVE_JNI |
| JNIEnv *env, |
| jclass clazz, |
| #endif |
| ) { |
| return (jlong)vmkit::Collector::getTotalMemory(); |
| } |
| |
| JNIEXPORT jlong Java_java_lang_VMRuntime_maxMemory( |
| #ifdef NATIVE_JNI |
| JNIEnv *env, |
| jclass clazz, |
| #endif |
| ) { |
| return (jlong)vmkit::Collector::getMaxMemory(); |
| } |
| |
| JNIEXPORT jint Java_java_lang_VMRuntime_availableProcessors(){ |
| #ifdef NATIVE_JNI |
| JNIEnv *env, |
| jclass clazz, |
| #endif |
| return vmkit::System::GetNumberOfProcessors(); |
| } |
| } |
| |