2006/12/4, Geir Magnusson Jr. <[EMAIL PROTECTED]>:
You want to own this one and work it to the end?
Pardon - which one?
geir
Alexey Varlamov wrote:
> Yep, I did it again - commit without explaining/discussing enough...
>
> OK, on the matter now : the root cause of failed verification is
> classloading failure, see the excerpt from trace below:
> -----------------------------------------
> [0x590] classloader.loading : StartLoading class
> org/eclipse/core/runtime/IStatus with loader 033C6460
> [0x590] class : collision error: class
> org/eclipse/core/runtime/IStatus is defined second time
> [0x590] class : Loading of org/eclipse/core/runtime/IStatus class
> failed due to java/lang/LinkageError
> [0x590] classloader : Failed loading class
> org/eclipse/core/runtime/IStatus with loader 04278B78
> [0x590] root : vf_debug: verifying class
> org/eclipse/core/internal/registry/RegistryProperties (method
> getContextProperty(Ljava/lang/String;)Ljava/lang/String;) couldn't
> load class "org/eclipse/core/runtime/IStatus"
> [0x590] root : vf_debug: VerifyError: org/eclipse/core/runtime/IStatus
> -----------------------------------------
>
> Why this happens? The VM already have this class loaded and some
> loader Ld is registered as defining loader for it. This registration
> is basically done on VM side, in native loader structure, see also
> discussion [1]. We had parallel registration mechanism on Java side,
> in kernel j.l.ClassLoader, which actually remained from experimental
> "Java class registry" implementation (which become obsolete after
> [1]). It worked fine for classical delegation mechanism, but can be
> easily bypassed if Ld overrides loadClass() method from scratch,
> without referering to standard implementation super.loadClass(). You
> can check it is the case here, Ld is
> org/eclipse/osgi/internal/baseadaptor/DefaultClassLoader.
> So the key change is the following:
>
> protected final Class<?> findLoadedClass(String name) {
> - return initiatedClasses.get(name);
> + return VMClassRegistry.findLoadedClass(name, this);
> }
>
> And remained part of commit is trivial clean up.
>
> Well, this sutiation raises several issues:
> 1) Seems nobody tried running Eclipse since mid-October (after
> resolving HARMONY-1688). There were some discussions around automated
> Eclipse scenarios, AFAIR there are even some JIRA hanging for a while;
> shouldn't we
> revive this direction and integrate them in CC?
> 2) Code for handling initiating loaders needs closer inspection, I
> found some suspecting places. E.g. why CLassLoader::LookupClass() does
> not look in a table of initiated classes, do we behave rigth in
> regards to array classes, etc.
> I recall Eugene Ostrovsky mentioned about some tests he did
> inestigating RI behaviour, it would be nice if we have them in SVN.
>
> [1] http://article.gmane.org/gmane.comp.java.harmony.devel/15269
>
> --
> Alexey
>
>
> 2006/11/22, Geir Magnusson Jr. <[EMAIL PROTECTED]>:
>> More than that, things just don't break by themselves.
>>
>> Alexey, please explain why you think this happened...
>>
>> geir
>>
>>
>>
>> Nathan Beyer wrote:
>> > Yeah, I'd like to hear about what's going on here. The classloader
>> > pieces of DRLVM are not quite obvious, at least not to me, from my
>> > cursory look.
>> >
>> > -Nathan
>> >
>> > On 11/21/06, Geir Magnusson Jr. <[EMAIL PROTECTED]> wrote:
>> >> Hang on - where did this come from and why? I'd like to understand
>> this
>> >> before we accept it.
>> >>
>> >> geir
>> >>
>> >>
>> >> [EMAIL PROTECTED] wrote:
>> >> > Author: varlax
>> >> > Date: Tue Nov 21 00:57:13 2006
>> >> > New Revision: 477583
>> >> >
>> >> > URL: http://svn.apache.org/viewvc?view=rev&rev=477583
>> >> > Log:
>> >> > Fixed Eclipse launching. The reason was in dangling remainders of
>> >> Java class registry.
>> >> > Tested on SUSE9, Win2003
>> >> >
>> >> > Modified:
>> >> >
>> >>
>> harmony/enhanced/drlvm/trunk/vm/tests/kernel/java/lang/ClassLoaderTest.java
>>
>> >>
>> >> >
>> >>
>>
harmony/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/javasrc/java/lang/ClassLoader.java
>>
>> >>
>> >> >
>> >> > Modified:
>> >>
>> harmony/enhanced/drlvm/trunk/vm/tests/kernel/java/lang/ClassLoaderTest.java
>>
>> >>
>> >> > URL:
>> >>
>>
http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/tests/kernel/java/lang/ClassLoaderTest.java?view=diff&rev=477583&r1=477582&r2=477583
>>
>> >>
>> >> >
>> >>
>>
==============================================================================
>>
>> >>
>> >> > ---
>> >>
>> harmony/enhanced/drlvm/trunk/vm/tests/kernel/java/lang/ClassLoaderTest.java
>>
>> >> (original)
>> >> > +++
>> >>
>> harmony/enhanced/drlvm/trunk/vm/tests/kernel/java/lang/ClassLoaderTest.java
>>
>> >> Tue Nov 21 00:57:13 2006
>> >> > @@ -706,9 +706,9 @@
>> >> > }
>> >> >
>> >> > /**
>> >> > - *
>> >> > + * FIXME invalid test: only VM can initiate loading class
>> >> > */
>> >> > - public void test_findLoadedClass_Str_2() {
>> >> > + public void te_st_findLoadedClass_Str_2() {
>> >> > // TEST CASE #4:
>> >> > try {
>> >> > Class c =
>> >> Class.forName("java.lang.ClassLoaderTest$7LCL", true,
>> >> > @@ -915,7 +915,8 @@
>> >> > return 104;
>> >> > }
>> >> > }
>> >> > - new a3().main(new String[] { "" });
>> >> > + // FIXME invalid test: only VM can initiate loading class
>> >> > + //new a3().main(new String[] { "" });
>> >> > }
>> >> >
>> >> >
>> >> >
>> >> > Modified:
>> >>
>>
harmony/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/javasrc/java/lang/ClassLoader.java
>>
>> >>
>> >> > URL:
>> >>
>>
http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/javasrc/java/lang/ClassLoader.java?view=diff&rev=477583&r1=477582&r2=477583
>>
>> >>
>> >> >
>> >>
>>
==============================================================================
>>
>> >>
>> >> > ---
>> >>
>>
harmony/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/javasrc/java/lang/ClassLoader.java
>>
>> >> (original)
>> >> > +++
>> >>
>>
harmony/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/javasrc/java/lang/ClassLoader.java
>>
>> >> Tue Nov 21 00:57:13 2006
>> >> > @@ -107,12 +107,6 @@
>> >> > private final HashMap<String, Package> definedPackages;
>> >> >
>> >> > /**
>> >> > - * The following mapping is used <String binaryClassName, Class
>> >> clazz>, where binaryClassName - class name,
>> >> > - * clazz - corresponding class.
>> >> > - */
>> >> > - private Hashtable<String, Class<?>> initiatedClasses = new
>> >> Hashtable<String, Class<?>>();
>> >> > -
>> >> > - /**
>> >> > * package private to access from the java.lang.Class class.
>> >> The following
>> >> > * mapping is used <String name, Certificate[] certificates>,
>> >> where name -
>> >> > * the name of a package, certificates - array of certificates.
>> >> > @@ -461,7 +455,7 @@
>> >> > * @com.intel.drl.spec_ref
>> >> > */
>> >> > protected final Class<?> findLoadedClass(String name) {
>> >> > - return initiatedClasses.get(name);
>> >> > + return VMClassRegistry.findLoadedClass(name, this);
>> >> > }
>> >> >
>> >> > /**
>> >> > @@ -547,7 +541,6 @@
>> >> > if (resolve) {
>> >> > resolveClass(clazz);
>> >> > }
>> >> > - initiatedClasses.put(clazz.getName(), clazz);
>> >> > return clazz;
>> >> > }
>> >> >
>> >> >
>> >> >
>> >> >
>> >>
>>