blob: f75e57b0343ab0cd62eb60d323c716c9b96b76de [file] [log] [blame]
//===------ ClasspathVMRuntime.cpp - GNU classpath java/lang/VMRuntime ----===//
//
// JnJVM
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#include <dlfcn.h>
#include <string.h>
#include "MvmGC.h"
#include "types.h"
#include "JavaArray.h"
#include "JavaClass.h"
#include "JavaObject.h"
#include "JavaString.h"
#include "JavaTypes.h"
#include "JavaThread.h"
#include "JavaUpcalls.h"
#include "Jnjvm.h"
#include "LockedMap.h"
#include "NativeUtil.h"
using namespace jnjvm;
extern "C" {
JNIEXPORT jobject JNICALL Java_java_lang_VMRuntime_mapLibraryName(
#ifdef NATIVE_JNI
JNIEnv *env,
jclass clazz,
#endif
jobject _strLib) {
JavaString* strLib = (JavaString*)_strLib;
Jnjvm* vm = JavaThread::get()->isolate;
const UTF8* 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);
ArrayUInt16* 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));
return (jobject)(vm->UTF8ToStr((const UTF8*)array));
}
typedef int (*onLoad_t)(const void**, void*);
JNIEXPORT jint JNICALL Java_java_lang_VMRuntime_nativeLoad(
#ifdef NATIVE_JNI
JNIEnv *env,
jclass clazz,
#endif
jobject _str,
jobject _loader) {
JavaString* str = (JavaString*)_str;
Jnjvm* vm = JavaThread::get()->isolate;
JnjvmClassLoader* loader =
JnjvmClassLoader::getJnjvmLoaderFromJavaObject((JavaObject*)_loader, vm);
char* buf = str->strToAsciiz();
void* res = dlopen(buf, RTLD_LAZY | RTLD_LOCAL);
if (res != 0) {
loader->nativeLibs.push_back(res);
onLoad_t onLoad = (onLoad_t)(intptr_t)dlsym(res, "JNI_OnLoad");
if (onLoad) onLoad(&vm->javavmEnv, 0);
return 1;
} else {
return 0;
}
}
JNIEXPORT void JNICALL Java_java_lang_VMRuntime_gc(
#ifdef NATIVE_JNI
JNIEnv *env,
jclass clazz,
#endif
) {
#ifdef MULTIPLE_GC
mvm::Thread::get()->GC->collect();
#else
Collector::collect();
#endif
}
JNIEXPORT void JNICALL Java_java_lang_VMRuntime_runFinalization(
#ifdef NATIVE_JNI
JNIEnv *env,
jclass clazz,
#endif
) {
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
) {
#ifdef MULTIPLE_GC
return (jlong)JavaThread::get()->GC->getFreeMemory();
#else
return (jlong)Collector::getFreeMemory();
#endif
}
JNIEXPORT jlong Java_java_lang_VMRuntime_totalMemory(
#ifdef NATIVE_JNI
JNIEnv *env,
jclass clazz,
#endif
) {
#ifdef MULTIPLE_GC
return (jlong)mvm::Thread::get()->GC->getTotalMemory();
#else
return (jlong)Collector::getTotalMemory();
#endif
}
JNIEXPORT jlong Java_java_lang_VMRuntime_maxMemory(
#ifdef NATIVE_JNI
JNIEnv *env,
jclass clazz,
#endif
) {
#ifdef MULTIPLE_GC
return (jlong)mvm::Thread::get()->GC->getMaxMemory();
#else
return (jlong)Collector::getMaxMemory();
#endif
}
JNIEXPORT jint Java_java_lang_VMRuntime_availableProcessors(){
#ifdef NATIVE_JNI
JNIEnv *env,
jclass clazz,
#endif
return 1;
}
}