blob: a137e7ef4d5c33276ecbfd5697cc632e8c81288f [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 "MvmGC.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 <csetjmp>
#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 = strLib->value;
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 = array->elements;
memmove(elements, vm->bootstrapLoader->prelib->elements,
lgPre * sizeof(uint16));
memmove(&(elements[lgPre]), &(utf8Lib->elements[stLib]),
lgLib * sizeof(uint16));
memmove(&(elements[lgPre + lgLib]), vm->bootstrapLoader->postlib->elements,
lgPost * sizeof(uint16));
res = vm->constructString(array);
END_NATIVE_EXCEPTION
return res;
}
#if defined(__MACH__)
typedef int* jumpbuf_t;
#else
typedef __jmp_buf_tag* jumpbuf_t;
#endif
typedef int (*onLoad_t)(const void**, void*);
extern "C" void j3EndJNI(uint32** old);
extern "C" void j3StartJNI(uint32* num, uint32** old, mvm::KnownFrame* Frame);
extern "C" void callOnLoad(void* res, JnjvmClassLoader* loader, Jnjvm* vm)
__attribute__ ((noinline));
// 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;
mvm::KnownFrame Frame;
j3StartJNI(&num, &old, &Frame);
onLoad(&vm->javavmEnv, res);
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);
char* buf = str->strToAsciiz();
res = loader->loadLib(buf);
if (res) callOnLoad(res, loader, vm);
delete[] buf;
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)
mvm::Collector::collect();
END_NATIVE_EXCEPTION
}
JNIEXPORT void JNICALL Java_java_lang_VMRuntime_runFinalization(
#ifdef NATIVE_JNI
JNIEnv *env,
jclass clazz,
#endif
) {
Jnjvm* vm = JavaThread::get()->getJVM();
vm->wakeUpFinalizers();
// 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) {
#if defined(ISOLATE) || defined(ISOLATE_SHARING)
// TODO: do a longjmp
exit(par1);
#else
exit(par1);
#endif
}
JNIEXPORT jlong Java_java_lang_VMRuntime_freeMemory(
#ifdef NATIVE_JNI
JNIEnv *env,
jclass clazz,
#endif
) {
return (jlong)mvm::Collector::getFreeMemory();
}
JNIEXPORT jlong Java_java_lang_VMRuntime_totalMemory(
#ifdef NATIVE_JNI
JNIEnv *env,
jclass clazz,
#endif
) {
return (jlong)mvm::Collector::getTotalMemory();
}
JNIEXPORT jlong Java_java_lang_VMRuntime_maxMemory(
#ifdef NATIVE_JNI
JNIEnv *env,
jclass clazz,
#endif
) {
return (jlong)mvm::Collector::getMaxMemory();
}
JNIEXPORT jint Java_java_lang_VMRuntime_availableProcessors(){
#ifdef NATIVE_JNI
JNIEnv *env,
jclass clazz,
#endif
return 1;
}
}