Changes: Joseph Wenninger
Christian Thalinger
- $Id: Runtime.c 997 2004-03-30 21:49:28Z twisti $
+ $Id: Runtime.c 1431 2004-11-02 15:22:57Z twisti $
*/
#include <stdlib.h>
#include <unistd.h>
#include <sys/utsname.h>
+#include "main.h"
#include "jni.h"
#include "builtin.h"
+#include "exceptions.h"
#include "loader.h"
#include "native.h"
#include "tables.h"
#include "asmpart.h"
#include "mm/boehm.h"
-#include "toolbox/loging.h"
+#include "toolbox/logging.h"
#include "toolbox/memory.h"
#include "java_io_File.h"
#include "java_lang_String.h"
#include "java_lang_Process.h"
#include "java_util_Properties.h" /* needed for java_lang_Runtime.h */
-#include "java_lang_Runtime.h"
+#include "java_lang_VMRuntime.h"
+#include "config.h"
+#ifndef STATIC_CLASSPATH
+#include <dlfcn.h>
+#endif
#define 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();
+
cacao_shutdown(par1);
}
* 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_finalize_all();
+ 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)
{
- log_text("Java_java_lang_Runtime_runFinalizersOnExit0 called");
+#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)
+{
+ 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
char *buffer;
int buffer_len;
utf *data;
-
+ int retVal=0;
+
data = javastring_toutf(par1, 0);
if (!data) {
buffer = MNEW(char, buffer_len);
-
- strcpy(buffer, "Java_java_lang_Runtime_nativeLoad:");
+#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
+ strcpy(buffer, "Java_java_lang_VMRuntime_nativeLoad:");
utf_sprint(buffer + strlen((char *) data), data);
log_text(buffer);
-
+
+
MFREE(buffer, char, buffer_len);
#endif
- log_text("Java_java_lang_Runtime_nativeLoad");
+ log_text("Java_java_lang_VMRuntime_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) + 3 /*lib*/ /*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);
+ sprintf(buffer,"lib");
+ utf_sprint(buffer+3,data);
+ /*strcat(buffer,".so");*/
+ log_text("nativeGetLibName:");
+ log_text(buffer);
+
+ resultString=javastring_new_char(buffer);
MFREE(buffer, char, buffer_len);
-#endif
- log_text("Java_java_lang_Runtime_nativeGetLibname");
- return 0;
+ 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 (!p)
- panic("Java_java_lang_Runtime_insertSystemProperties called with NULL-Argument");
+#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;
+ }
/* search for method to add properties */
m = class_resolvemethod(p->header.vftbl->class,
utf_new_char("(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;")
);
- if (!m)
- panic("Can not find method 'put' for class Properties");
+ if (!m) {
+ *exceptionptr = new_exception_message(string_java_lang_NoSuchMethodError,
+ "java.lang.Properties.put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;)");
+ return;
+ }
/* add the properties */
for (i = 0; i < activeprops; i++) {
/*
- * 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();
}