### Eclipse Workspace Patch 1.0 #P org.eclipse.osgi Index: defaultAdaptor/src/org/eclipse/osgi/internal/baseadaptor/DefaultClassLoader.java =================================================================== RCS file: /cvsroot/rt/org.eclipse.equinox/framework/bundles/org.eclipse.osgi/defaultAdaptor/src/org/eclipse/osgi/internal/baseadaptor/DefaultClassLoader.java,v retrieving revision 1.9 diff -u -r1.9 DefaultClassLoader.java --- defaultAdaptor/src/org/eclipse/osgi/internal/baseadaptor/DefaultClassLoader.java 6 Mar 2009 21:19:09 -0000 1.9 +++ defaultAdaptor/src/org/eclipse/osgi/internal/baseadaptor/DefaultClassLoader.java 22 Apr 2009 20:31:03 -0000 @@ -12,6 +12,7 @@ package org.eclipse.osgi.internal.baseadaptor; import java.io.IOException; +import java.lang.reflect.Method; import java.net.MalformedURLException; import java.net.URL; import java.security.*; @@ -34,19 +35,35 @@ * @see BaseClassLoader * @see ClasspathManager */ -public class DefaultClassLoader extends ClassLoader implements BaseClassLoader { +public class DefaultClassLoader extends ClassLoader implements ParallelClassLoader { /** * A PermissionCollection for AllPermissions; shared across all ProtectionDomains when security is disabled */ protected static final PermissionCollection ALLPERMISSIONS; private final static String CLASS_CERTIFICATE_SUPPORT = "osgi.support.class.certificate"; //$NON-NLS-1$ + private final static String CLASS_LOADER_TYPE = "osgi.classloader.type"; //$NON-NLS-1$ + private final static String CLASS_LOADER_TYPE_PARALLEL = "parallel"; //$NON-NLS-1$ private static final boolean CLASS_CERTIFICATE; + private static final boolean PARALLEL_CAPABLE; static { CLASS_CERTIFICATE = Boolean.valueOf(FrameworkProperties.getProperty(CLASS_CERTIFICATE_SUPPORT, "true")).booleanValue(); //$NON-NLS-1$ AllPermission allPerm = new AllPermission(); ALLPERMISSIONS = allPerm.newPermissionCollection(); if (ALLPERMISSIONS != null) ALLPERMISSIONS.add(allPerm); + boolean typeParallel = CLASS_LOADER_TYPE_PARALLEL.equals(FrameworkProperties.getProperty(CLASS_LOADER_TYPE)); + boolean parallelCapable = false; + try { + if (typeParallel) { + Method parallelCapableMetod = ClassLoader.class.getDeclaredMethod("registerAsParallelCapable", null); //$NON-NLS-1$ + parallelCapableMetod.setAccessible(true); + parallelCapable = ((Boolean) parallelCapableMetod.invoke(null, null)).booleanValue(); + } + } catch (Throwable e) { + // must do everything to avoid failing in clinit + parallelCapable = false; + } + PARALLEL_CAPABLE = parallelCapable; } protected ClassLoaderDelegate delegate; @@ -250,4 +267,8 @@ public Bundle getBundle() { return manager.getBaseData().getBundle(); } + + public boolean isParrallelCapable() { + return PARALLEL_CAPABLE; + } } Index: defaultAdaptor/src/org/eclipse/osgi/baseadaptor/loader/ClasspathManager.java =================================================================== RCS file: /cvsroot/rt/org.eclipse.equinox/framework/bundles/org.eclipse.osgi/defaultAdaptor/src/org/eclipse/osgi/baseadaptor/loader/ClasspathManager.java,v retrieving revision 1.16 diff -u -r1.16 ClasspathManager.java --- defaultAdaptor/src/org/eclipse/osgi/baseadaptor/loader/ClasspathManager.java 6 Mar 2009 21:19:09 -0000 1.16 +++ defaultAdaptor/src/org/eclipse/osgi/baseadaptor/loader/ClasspathManager.java 22 Apr 2009 20:31:03 -0000 @@ -56,6 +56,7 @@ // a collection of String[2], each element is {"libname", "libpath"} private Collection loadedLibraries = null; private HashMap classNameLocks = new HashMap(5); + private final boolean isParallelClassLoader; /** * Constructs a classpath manager for the given host base data, classpath and base class loader @@ -67,6 +68,7 @@ this.data = data; this.classpath = classpath; this.classloader = classloader; + isParallelClassLoader = (classloader instanceof ParallelClassLoader) ? ((ParallelClassLoader) classloader).isParrallelCapable() : false; } /** @@ -437,7 +439,7 @@ try { for (int i = 0; i < hooks.length; i++) hooks[i].preFindLocalClass(classname, this); - if (LOCK_CLASSNAME) + if (LOCK_CLASSNAME || isParallelClassLoader) result = findLocalClass_LockClassName(classname, hooks); else result = findLocalClass_LockClassLoader(classname, hooks); Index: defaultAdaptor/src/org/eclipse/osgi/baseadaptor/loader/ParallelClassLoader.java =================================================================== RCS file: defaultAdaptor/src/org/eclipse/osgi/baseadaptor/loader/ParallelClassLoader.java diff -N defaultAdaptor/src/org/eclipse/osgi/baseadaptor/loader/ParallelClassLoader.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ defaultAdaptor/src/org/eclipse/osgi/baseadaptor/loader/ParallelClassLoader.java 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,16 @@ +/******************************************************************************* + * Copyright (c) 2009 IBM Corporation and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * IBM Corporation - initial API and implementation + *******************************************************************************/ + +package org.eclipse.osgi.baseadaptor.loader; + +public interface ParallelClassLoader extends BaseClassLoader { + boolean isParrallelCapable(); +}