Changes: Joseph Wenninger
Christian Thalinger
- $Id: VMRuntime.c 1147 2004-06-06 13:20:11Z twisti $
+ $Id: VMRuntime.c 1433 2004-11-04 16:40:43Z motse $
*/
#include "main.h"
#include "jni.h"
#include "builtin.h"
+#include "exceptions.h"
#include "loader.h"
#include "native.h"
#include "tables.h"
#include "java_io_File.h"
#include "java_lang_String.h"
#include "java_lang_Process.h"
-#include "java_util_Properties.h" /* required by java_lang_Runtime.h */
-#include "java_lang_Runtime.h"
+#include "java_util_Properties.h" /* needed for java_lang_Runtime.h */
+#include "java_lang_VMRuntime.h"
+#include "config.h"
+#ifndef STATIC_CLASSPATH
+#include <dlfcn.h>
+#endif
-#define JOWENN_DEBUG
+#undef JOWENN_DEBUG
/* should we run all finalizers on exit? */
static s4 finalizeOnExit = false;
#define MAXPROPS 100
-static int activeprops = 19;
+static bool shouldFinalizersBeRunOnExit=false;
+static int activeprops = 20;
static char *proplist[MAXPROPS][2] = {
{ "java.class.path", NULL },
{ "os.arch", NULL },
{ "os.name", NULL },
{ "os.version", NULL },
+ { "java.library.path",NULL},
{ "java.class.version", "45.3" },
{ "java.version", PACKAGE":"VERSION },
activeprops++;
}
/*
- * Class: java_lang_Runtime
+ * Class: java_lang_VMRuntime
* Method: execInternal
* Signature: ([Ljava/lang/String;[Ljava/lang/String;Ljava/io/File;)Ljava/lang/Process;
*/
-JNIEXPORT java_lang_Process* JNICALL Java_java_lang_Runtime_execInternal(JNIEnv *env, java_lang_Runtime *this, java_objectarray *cmd, java_objectarray *shellenv, java_io_File *workingdir)
+JNIEXPORT java_lang_Process* JNICALL Java_java_lang_VMRuntime_execInternal(JNIEnv *env, jclass clazz, java_objectarray *cmd, java_objectarray *shellenv, java_io_File *workingdir)
{
log_text("Java_java_lang_Runtime_execInternal called");
/*
- * Class: java/lang/Runtime
+ * Class: java/lang/VMRuntime
* Method: exitInternal
* Signature: (I)V
*/
-JNIEXPORT void JNICALL Java_java_lang_Runtime_exitInternal(JNIEnv *env, java_lang_Runtime *this, s4 par1)
+JNIEXPORT void JNICALL Java_java_lang_VMRuntime_exit(JNIEnv *env, jclass clazz, s4 par1)
{
if (finalizeOnExit)
gc_finalize_all();
* Method: freeMemory
* Signature: ()J
*/
-JNIEXPORT s8 JNICALL Java_java_lang_Runtime_freeMemory(JNIEnv *env, java_lang_Runtime *this)
+JNIEXPORT s8 JNICALL Java_java_lang_VMRuntime_freeMemory(JNIEnv *env, jclass clazz)
{
return gc_get_free_bytes();
}
* Method: gc
* Signature: ()V
*/
-JNIEXPORT void JNICALL Java_java_lang_Runtime_gc(JNIEnv *env, java_lang_Runtime *this)
+JNIEXPORT void JNICALL Java_java_lang_VMRuntime_gc(JNIEnv *env, jclass clazz)
{
gc_call();
}
* Method: runFinalization
* Signature: ()V
*/
-JNIEXPORT void JNICALL Java_java_lang_Runtime_runFinalization(JNIEnv *env, java_lang_Runtime *this)
+JNIEXPORT void JNICALL Java_java_lang_VMRuntime_runFinalization(JNIEnv *env, jclass clazz)
{
gc_invoke_finalizers();
}
* Method: runFinalizersOnExit
* Signature: (Z)V
*/
-JNIEXPORT void JNICALL Java_java_lang_Runtime_runFinalizersOnExitInternal(JNIEnv *env, jclass clazz, s4 par1)
+JNIEXPORT void JNICALL Java_java_lang_VMRuntime_runFinalizersOnExit(JNIEnv *env, jclass clazz, s4 par1)
+{
+#ifdef __GNUC__
+#warning threading
+#endif
+ shouldFinalizersBeRunOnExit=par1;
+}
+
+/*
+ * Class: java/lang/Runtime
+ * Method: runFinalizationsForExit
+ * Signature: ()V
+ */
+JNIEXPORT void JNICALL Java_java_lang_VMRuntime_runFinalizationForExit(JNIEnv *env, jclass clazz)
{
- finalizeOnExit = par1;
+ if (shouldFinalizersBeRunOnExit) {
+ gc_call();
+ // gc_finalize_all();
+ }
+ log_text("Java_java_lang_VMRuntime_runFinalizationForExit called");
+
}
* Method: totalMemory
* Signature: ()J
*/
-JNIEXPORT s8 JNICALL Java_java_lang_Runtime_totalMemory(JNIEnv *env, java_lang_Runtime *this)
+JNIEXPORT s8 JNICALL Java_java_lang_VMRuntime_totalMemory(JNIEnv *env, jclass clazz)
{
return gc_get_heap_size();
}
* Method: traceInstructions
* Signature: (Z)V
*/
-JNIEXPORT void JNICALL Java_java_lang_Runtime_traceInstructions(JNIEnv *env, java_lang_Runtime *this, s4 par1)
+JNIEXPORT void JNICALL Java_java_lang_VMRuntime_traceInstructions(JNIEnv *env, jclass clazz, s4 par1)
{
/* not supported */
}
* Method: traceMethodCalls
* Signature: (Z)V
*/
-JNIEXPORT void JNICALL Java_java_lang_Runtime_traceMethodCalls(JNIEnv *env, java_lang_Runtime *this, s4 par1)
+JNIEXPORT void JNICALL Java_java_lang_VMRuntime_traceMethodCalls(JNIEnv *env, jclass clazz, s4 par1)
{
/* not supported */
}
* Method: availableProcessors
* Signature: ()I
*/
-JNIEXPORT s4 JNICALL Java_java_lang_Runtime_availableProcessors(JNIEnv *env, java_lang_Runtime *this)
+JNIEXPORT s4 JNICALL Java_java_lang_VMRuntime_availableProcessors(JNIEnv *env, jclass clazz)
{
#if defined(_SC_NPROC_ONLN)
return (s4) sysconf(_SC_NPROC_ONLN);
* Method: nativeLoad
* Signature: (Ljava/lang/String;)I
*/
-JNIEXPORT s4 JNICALL Java_java_lang_Runtime_nativeLoad(JNIEnv *env, java_lang_Runtime *this, java_lang_String *par1)
+JNIEXPORT s4 JNICALL Java_java_lang_VMRuntime_nativeLoad(JNIEnv *env, jclass clazz, java_lang_String *par1)
{
-#ifdef JOWENN_DEBUG
+ int retVal=0;
+
+
char *buffer;
int buffer_len;
utf *data;
-
+
+ log_text("Java_java_lang_VMRuntime_nativeLoad");
+
data = javastring_toutf(par1, 0);
if (!data) {
buffer = MNEW(char, buffer_len);
-
- strcpy(buffer, "Java_java_lang_Runtime_nativeLoad:");
+ strcpy(buffer, "Java_java_lang_VMRuntime_nativeLoad:");
utf_sprint(buffer + strlen((char *) data), data);
log_text(buffer);
-
+
+
MFREE(buffer, char, buffer_len);
+
+
+#ifndef STATIC_CLASSPATH
+ /*here it could be interesting to store the references in a list eg for nicely cleaning up or for certain platforms*/
+ if (dlopen(data->text,RTLD_NOW | RTLD_GLOBAL)) {
+ log_text("LIBLOADED");
+ retVal=1;
+ }
+#else
+ retVal=1;
#endif
- log_text("Java_java_lang_Runtime_nativeLoad");
- return 1;
+ return retVal;
}
/*
- * Class: java_lang_Runtime
+ * Class: java_lang_VMRuntime
* Method: nativeGetLibname
* Signature: (Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
*/
-JNIEXPORT java_lang_String* JNICALL Java_java_lang_Runtime_nativeGetLibname(JNIEnv *env, jclass clazz, java_lang_String *par1, java_lang_String *par2)
+JNIEXPORT java_lang_String* JNICALL Java_java_lang_VMRuntime_nativeGetLibname(JNIEnv *env, jclass clazz, java_lang_String *par1, java_lang_String *par2)
{
-#ifdef JOWENN_DEBUG
char *buffer;
int buffer_len;
utf *data;
-
+ java_lang_String *resultString;
data = javastring_toutf(par2, 0);
if (!data) {
return 0;;
}
- buffer_len = utf_strlen(data) + 40;
-
+ buffer_len = utf_strlen(data) + 6 /*lib .so */ +1 /*0*/;
buffer = MNEW(char, buffer_len);
-
- strcpy(buffer, "Java_java_lang_Runtime_nativeGetLibname:");
- utf_sprint(buffer + strlen((char *) data), data);
- log_text(buffer);
-
- MFREE(buffer, char, buffer_len);
+ sprintf(buffer,"lib");
+ utf_sprint(buffer+3,data);
+ strcat(buffer,".so");
+#ifdef JOWENN_DEBUG
+ log_text("nativeGetLibName:");
+ log_text(buffer);
#endif
- log_text("Java_java_lang_Runtime_nativeGetLibname");
+
+ resultString=javastring_new_char(buffer);
- return 0;
+ MFREE(buffer, char, buffer_len);
+ return resultString;
}
/*
- * Class: java_lang_Runtime
+ * Class: java_lang_VMRuntime
* Method: insertSystemProperties
* Signature: (Ljava/util/Properties;)V
*/
-JNIEXPORT void JNICALL Java_java_lang_Runtime_insertSystemProperties(JNIEnv *env, jclass clazz, java_util_Properties *p)
+JNIEXPORT void JNICALL Java_java_lang_VMRuntime_insertSystemProperties(JNIEnv *env, jclass clazz, java_util_Properties *p)
{
#define BUFFERSIZE 200
proplist[6][1] = utsnamebuf.sysname;
proplist[7][1] = utsnamebuf.release;
+#if defined(STATIC_CLASSPATH)
+ proplist[8][1] = ".";
+#else
+ proplist[8][1] = getenv("LD_LIBRARY_PATH");
+#endif
+
if (!p) {
*exceptionptr = new_exception(string_java_lang_NullPointerException);
return;
/*
- * Class: java_lang_Runtime
+ * Class: java_lang_VMRuntime
* Method: maxMemory
* Signature: ()J
*/
-JNIEXPORT s8 JNICALL Java_java_lang_Runtime_maxMemory(JNIEnv *env, java_lang_Runtime *this)
+JNIEXPORT s8 JNICALL Java_java_lang_VMRuntime_maxMemory(JNIEnv *env, jclass clazz)
{
return gc_get_max_heap_size();
}