Fix for --disable-dynamicclasspath with empty LD_LIBRARY_PATH
[cacao.git] / nat / Runtime.c
index 7e6de7ff8cc86453cc6370ae782c8f29f9dd35d1..eee7993c54c13afa044836656b20f1c93eec6a28 100644 (file)
@@ -29,7 +29,7 @@
    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 },
@@ -70,6 +79,7 @@ static char *proplist[MAXPROPS][2] = {
        { "os.arch", NULL },
        { "os.name", NULL },
        { "os.version", NULL },
+        { "java.library.path",NULL},
                                          
        { "java.class.version", "45.3" },
        { "java.version", PACKAGE":"VERSION },
@@ -93,11 +103,11 @@ void attach_property(char *name, char *value)
         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");
 
@@ -106,12 +116,15 @@ JNIEXPORT java_lang_Process* JNICALL Java_java_lang_Runtime_execInternal(JNIEnv
 
 
 /*
- * 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);
 }
 
@@ -121,7 +134,7 @@ JNIEXPORT void JNICALL Java_java_lang_Runtime_exitInternal(JNIEnv *env, java_lan
  * 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();
 }
@@ -132,7 +145,7 @@ JNIEXPORT s8 JNICALL Java_java_lang_Runtime_freeMemory(JNIEnv *env, java_lang_Ru
  * 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();
 }
@@ -143,9 +156,9 @@ JNIEXPORT void JNICALL Java_java_lang_Runtime_gc(JNIEnv *env, java_lang_Runtime
  * 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();
 }
 
 
@@ -154,9 +167,27 @@ JNIEXPORT void JNICALL Java_java_lang_Runtime_runFinalization(JNIEnv *env, java_
  * 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");
+
 }
 
 
@@ -165,7 +196,7 @@ JNIEXPORT void JNICALL Java_java_lang_Runtime_runFinalizersOnExitInternal(JNIEnv
  * 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();
 }
@@ -176,7 +207,7 @@ JNIEXPORT s8 JNICALL Java_java_lang_Runtime_totalMemory(JNIEnv *env, java_lang_R
  * 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 */
 }
@@ -187,7 +218,7 @@ JNIEXPORT void JNICALL Java_java_lang_Runtime_traceInstructions(JNIEnv *env, jav
  * 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 */
 }
@@ -198,7 +229,7 @@ JNIEXPORT void JNICALL Java_java_lang_Runtime_traceMethodCalls(JNIEnv *env, java
  * 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);
@@ -217,13 +248,14 @@ JNIEXPORT s4 JNICALL Java_java_lang_Runtime_availableProcessors(JNIEnv *env, jav
  * 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) {
@@ -235,31 +267,39 @@ JNIEXPORT s4 JNICALL Java_java_lang_Runtime_nativeLoad(JNIEnv *env, java_lang_Ru
 
                
        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) {
@@ -267,28 +307,28 @@ JNIEXPORT java_lang_String* JNICALL Java_java_lang_Runtime_nativeGetLibname(JNIE
                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
@@ -309,8 +349,16 @@ JNIEXPORT void JNICALL Java_java_lang_Runtime_insertSystemProperties(JNIEnv *env
        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,
@@ -318,8 +366,11 @@ JNIEXPORT void JNICALL Java_java_lang_Runtime_insertSystemProperties(JNIEnv *env
                                                        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++) {
@@ -339,11 +390,11 @@ JNIEXPORT void JNICALL Java_java_lang_Runtime_insertSystemProperties(JNIEnv *env
 
 
 /*
- * 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();
 }