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]

PATCH for a RegisterClass hook


This patch allocs re-directing RegisterClass calls.  This is necessary
when you want to have a ClassLoader manage the classes loaded in
a ClassLoader, as opposed to the default when the classes in a
shared library are entered into the global class name using the
system class loader.

I have a utility class I will contribute later that allows creation
of a ClassLoader backed by a shared library.  I use this for
implementing pseudo-servlets for Apache.

Any reason not to check this in?

2001-08-30  Per Bothner  <per@bothner.com>

	* gcj/javaprims.h (_Jv_RegisterClassHook):  New extern declaration.
	(_Jv_RegisterClassHookDefault):  Likewise.
	* java/lang/Class.h (_Jv_RegisterClassHookDefault):  Declare as friend.
	* java/lang/natClassLoader.java

Index: prims.cc
===================================================================
RCS file: /cvs/gcc/gcc/libjava/prims.cc,v
retrieving revision 1.57
diff -u -p -r1.57 prims.cc
--- prims.cc	2001/08/26 11:30:07	1.57
+++ prims.cc	2001/08/30 21:41:16
@@ -64,6 +64,7 @@ details.  */
 #include <java/lang/reflect/Modifier.h>
 #include <java/io/PrintStream.h>
 #include <java/lang/UnsatisfiedLinkError.h>
+#include <gnu/gcj/runtime/VMClassLoader.h>
 
 #ifdef USE_LTDL
 #include <ltdl.h>
@@ -921,7 +922,7 @@ _Jv_RunMain (jclass klass, const char *n
 	  // jar file only.  The easiest way to do this is to lose our
 	  // reference to the previous classloader.
 	  _Jv_Jar_Class_Path = strdup (name);
-	  java::lang::ClassLoader::system = NULL;
+	  gnu::gcj::runtime::VMClassLoader::instance = NULL;
 	}
     }
   catch (java::lang::Throwable *t)
Index: gcj/javaprims.h
===================================================================
RCS file: /cvs/gcc/gcc/libjava/gcj/javaprims.h,v
retrieving revision 1.25
diff -u -p -r1.25 javaprims.h
--- javaprims.h	2001/08/26 11:30:07	1.25
+++ javaprims.h	2001/08/30 21:41:16
@@ -411,6 +411,8 @@ extern "C" void _Jv_Throw (jthrowable) _
 extern "C" void* _Jv_Malloc (jsize) __attribute__((__malloc__));
 extern "C" void* _Jv_Realloc (void *, jsize);
 extern "C" void _Jv_Free (void*);
+extern void (*_Jv_RegisterClassHook) (jclass cl);
+extern "C" void _Jv_RegisterClassHookDefault (jclass);
 
 typedef unsigned short _Jv_ushort __attribute__((__mode__(__HI__)));
 typedef unsigned int _Jv_uint __attribute__((__mode__(__SI__)));
Index: java/lang/Class.h
===================================================================
RCS file: /cvs/gcc/gcc/libjava/java/lang/Class.h,v
retrieving revision 1.36
diff -u -p -r1.36 Class.h
--- Class.h	2001/08/24 17:24:44	1.36
+++ Class.h	2001/08/30 21:41:16
@@ -298,6 +298,7 @@ private:   
 
   friend void _Jv_WaitForState (jclass, int);
   friend void _Jv_RegisterClasses (jclass *classes);
+  friend void _Jv_RegisterClassHookDefault (jclass klass);
   friend void _Jv_RegisterInitiatingLoader (jclass,java::lang::ClassLoader*);
   friend void _Jv_UnregisterClass (jclass);
   friend jclass _Jv_FindClass (_Jv_Utf8Const *name,
Index: java/lang/natClassLoader.cc
===================================================================
RCS file: /cvs/gcc/gcc/libjava/java/lang/natClassLoader.cc,v
retrieving revision 1.33
diff -u -p -r1.33 natClassLoader.cc
--- natClassLoader.cc	2001/08/22 23:10:07	1.33
+++ natClassLoader.cc	2001/08/30 21:41:17
@@ -439,10 +439,9 @@ _Jv_RegisterClasses (jclass *classes)
   for (; *classes; ++classes)
     {
       jclass klass = *classes;
-      jint hash = HASH_UTF (klass->name);
-      klass->next = loaded_classes[hash];
-      loaded_classes[hash] = klass;
 
+      (*_Jv_RegisterClassHook) (klass);
+
       // registering a compiled class causes
       // it to be immediately "prepared".  
       if (klass->state == JV_STATE_NOTHING)
@@ -451,6 +450,21 @@ _Jv_RegisterClasses (jclass *classes)
 }
 
 void
+_Jv_RegisterClassHookDefault (jclass klass)
+{
+  jint hash = HASH_UTF (klass->name);
+  klass->next = loaded_classes[hash];
+  loaded_classes[hash] = klass;
+}
+
+// A pointer to a function that actually registers a class.
+// Normally _Jv_RegisterClassHookDefault, but could be some other function
+// that registers the class in e.g. a ClassLoader-local table.
+// Should synchronize on Class:class$ while setting/restore this variable.
+
+void (*_Jv_RegisterClassHook) (jclass cl) = _Jv_RegisterClassHookDefault;
+
+void
 _Jv_RegisterClass (jclass klass)
 {
   jclass classes[2];
-- 
	--Per Bothner
per@bothner.com   http://www.bothner.com/per/


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