This is the mail archive of the java-patches@gcc.gnu.org mailing list for the Java project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Patch: FYI:


I'm checking this in.

This cleans up Runtime._load a little, removes a few #ifdefs by
introducing a new platform define, and adds support for
ClassLoader.findLibrary().

Tom

Index: ChangeLog
from  Tom Tromey  <tromey@redhat.com>
	* include/win32.h (_Jv_platform_solib_prefix): New define.
	(_Jv_platform_solib_suffix): Likewise.
	* include/posix.h (_Jv_platform_solib_prefix): New define.
	(_Jv_platform_solib_suffix): Likewise.
	* java/lang/natRuntime.cc: Include StackTrace.h.
	(_load): Use findLibrary and new platform defines.
	(nativeGetLibname): Use new platform defines.

Index: include/win32.h
===================================================================
RCS file: /cvs/gcc/gcc/libjava/include/win32.h,v
retrieving revision 1.14
diff -u -r1.14 win32.h
--- include/win32.h 22 Nov 2002 10:27:53 -0000 1.14
+++ include/win32.h 10 Dec 2002 01:31:03 -0000
@@ -22,6 +22,10 @@
 
 #include <io.h>
 
+// Prefix and suffix for shared libraries.
+#define _Jv_platform_solib_prefix ""
+#define _Jv_platform_solib_suffix ".dll"
+
 #ifndef DISBALE_JAVA_NET
 
 // these errors cannot occur on Win32
Index: include/posix.h
===================================================================
RCS file: /cvs/gcc/gcc/libjava/include/posix.h,v
retrieving revision 1.12
diff -u -r1.12 posix.h
--- include/posix.h 26 Nov 2002 20:09:27 -0000 1.12
+++ include/posix.h 10 Dec 2002 01:31:03 -0000
@@ -40,6 +40,10 @@
 #include <gcj/cni.h>
 #include <java/util/Properties.h>
 
+// Prefix and suffix for shared libraries.
+#define _Jv_platform_solib_prefix "lib"
+#define _Jv_platform_solib_suffix ".so"
+
 #ifndef DISABLE_JAVA_NET
 #include <java/net/InetAddress.h>
 #endif
Index: java/lang/natRuntime.cc
===================================================================
RCS file: /cvs/gcc/gcc/libjava/java/lang/natRuntime.cc,v
retrieving revision 1.28
diff -u -r1.28 natRuntime.cc
--- java/lang/natRuntime.cc 14 Nov 2002 18:28:07 -0000 1.28
+++ java/lang/natRuntime.cc 10 Dec 2002 01:31:03 -0000
@@ -27,6 +27,8 @@
 #include <java/lang/StringBuffer.h>
 #include <java/lang/Process.h>
 #include <java/lang/ConcreteProcess.h>
+#include <java/lang/ClassLoader.h>
+#include <gnu/gcj/runtime/StackTrace.h>
 
 #include <jni.h>
 
@@ -161,18 +163,56 @@
   using namespace java::lang;
 #ifdef USE_LTDL
   jint len = _Jv_GetStringUTFLength (path);
-  char buf[len + 1 + 3];
+  char buf[len + 1 + strlen (_Jv_platform_solib_prefix)
+	   + strlen (_Jv_platform_solib_suffix)];
   int offset = 0;
-#ifndef WIN32
-  // On Unix boxes, prefix library name with `lib', for loadLibrary.
   if (do_search)
     {
-      strcpy (buf, "lib");
-      offset = 3;
+      strcpy (buf, _Jv_platform_solib_prefix);
+      offset = strlen (_Jv_platform_solib_prefix);
     }
-#endif
   jsize total = JvGetStringUTFRegion (path, 0, path->length(), &buf[offset]);
   buf[offset + total] = '\0';
+
+  char *lib_name = buf;
+
+  if (do_search)
+    {
+      ClassLoader *sys = ClassLoader::getSystemClassLoader();
+      ClassLoader *look = NULL;
+      gnu::gcj::runtime::StackTrace *t = new gnu::gcj::runtime::StackTrace(10);
+      for (int i = 0; i < 10; ++i)
+	{
+	  jclass klass = t->classAt(i);
+	  if (klass != NULL)
+	    {
+	      ClassLoader *loader = klass->getClassLoaderInternal();
+	      if (loader != NULL && loader != sys)
+		{
+		  look = loader;
+		  break;
+		}
+	    }
+	}
+      if (look != NULL)
+	{
+	  // Don't include solib prefix in string passed to
+	  // findLibrary.
+	  jstring name = look->findLibrary(JvNewStringUTF(&buf[offset]));
+	  if (name != NULL)
+	    {
+	      len = _Jv_GetStringUTFLength (name);
+	      lib_name = (char *) _Jv_AllocBytes(len + 1);
+	      total = JvGetStringUTFRegion (name, 0,
+					    name->length(), lib_name);
+	      lib_name[total] = '\0';
+	      // Don't append suffixes any more; we have the full file
+	      // name.
+	      do_search = false;
+	    }
+	}
+    }
+
   lt_dlhandle h;
   // FIXME: make sure path is absolute.
   {
@@ -180,7 +220,7 @@
     // concurrent modification by class registration calls which may be run
     // during the dlopen().
     JvSynchronize sync (&java::lang::Class::class$);
-    h = do_search ? lt_dlopenext (buf) : lt_dlopen (buf);
+    h = do_search ? lt_dlopenext (lib_name) : lt_dlopen (lib_name);
   }
   if (h == NULL)
     {
@@ -602,19 +642,9 @@
 #endif
     }
 
-  // FIXME: use platform function here.
-#ifndef WIN32
-  sb->append (JvNewStringLatin1 ("lib"));
-#endif
-
+  sb->append (JvNewStringLatin1 (_Jv_platform_solib_prefix));
   sb->append(libname);
-
-  // FIXME: use platform function here.
-#ifdef WIN32
-  sb->append (JvNewStringLatin1 ("dll"));
-#else
-  sb->append (JvNewStringLatin1 ("so"));
-#endif
+  sb->append (JvNewStringLatin1 (_Jv_platform_solib_suffix));
 
   return sb->toString();
 }


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]