blob: 0e3a6185ef72f8af04691979fdf8ca33bca233f7 [file] [log] [blame]
//===------ 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();
}
}