nativeLoad remove #ifdef JOWENNDEBUG
[cacao.git] / src / native / vm / VMRuntime.c
index 9287d7c2498f4b59752df63bbcf732d566586414..0f6f5a42098b071963d3d630c6f8c835b0f399e1 100644 (file)
@@ -29,7 +29,7 @@
    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 $
 
 */
 
@@ -41,6 +41,7 @@
 #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 },
@@ -73,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 },
@@ -96,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");
 
@@ -109,11 +116,11 @@ 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();
@@ -127,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();
 }
@@ -138,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();
 }
@@ -149,7 +156,7 @@ 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_invoke_finalizers();
 }
@@ -160,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)
+{
+#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");
+
 }
 
 
@@ -171,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();
 }
@@ -182,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 */
 }
@@ -193,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 */
 }
@@ -204,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);
@@ -223,13 +248,17 @@ 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    
+       int retVal=0;
+
+
        char *buffer;
        int buffer_len;
        utf *data;
-       
+
+       log_text("Java_java_lang_VMRuntime_nativeLoad");
+
        data = javastring_toutf(par1, 0);
        
        if (!data) {
@@ -241,31 +270,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:");
+       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) {
@@ -273,28 +310,29 @@ JNIEXPORT java_lang_String* JNICALL Java_java_lang_Runtime_nativeGetLibname(JNIE
                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
@@ -315,6 +353,12 @@ JNIEXPORT void JNICALL Java_java_lang_Runtime_insertSystemProperties(JNIEnv *env
        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;
@@ -350,11 +394,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();
 }