diff options
author | Thomas Watson | 2013-02-20 17:06:19 +0000 |
---|---|---|
committer | Thomas Watson | 2013-02-20 17:06:19 +0000 |
commit | c635eaa22497b936f24ad94557b9b8b1f2d146dc (patch) | |
tree | b533afc8ee7a0c16744f0253a9e2c71612acd47e /bundles | |
parent | 54e1b1dcbcb07728f2f8cf5640905980e8d6796e (diff) | |
download | rt.equinox.framework-c635eaa22497b936f24ad94557b9b8b1f2d146dc.tar.gz rt.equinox.framework-c635eaa22497b936f24ad94557b9b8b1f2d146dc.tar.xz rt.equinox.framework-c635eaa22497b936f24ad94557b9b8b1f2d146dc.zip |
Make trigger class load persistent per class loader.
Diffstat (limited to 'bundles')
4 files changed, 54 insertions, 1 deletions
diff --git a/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/container/Module.java b/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/container/Module.java index 5f2e2f3c8..abe5e219a 100644 --- a/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/container/Module.java +++ b/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/container/Module.java @@ -360,6 +360,7 @@ public abstract class Module implements BundleReference, BundleStartLevel, Compa } ModuleEvent event; if (StartOptions.LAZY_TRIGGER.isContained(options)) { + setTrigger(); if (stateChangeLock.getHoldCount() > 0 && stateTransitionEvents.contains(ModuleEvent.STARTED)) { // nothing to do here; the current thread is activating the bundle. return; @@ -505,7 +506,7 @@ public abstract class Module implements BundleReference, BundleStartLevel, Compa // continue on to normal starting } } else { - if (isLazyActivate(options)) { + if (isLazyActivate(options) && !isTriggerSet()) { if (State.LAZY_STARTING.equals(getState())) { // a sync listener must have tried to start this module again with the lazy option return null; // no event to publish; nothing to do @@ -537,6 +538,30 @@ public abstract class Module implements BundleReference, BundleStartLevel, Compa } } + private void setTrigger() { + ModuleLoader loader = getCurrentLoader(); + if (loader != null) { + loader.getAndSetTrigger(); + } + } + + private boolean isTriggerSet() { + ModuleLoader loader = getCurrentLoader(); + return loader == null ? false : loader.isTriggerSet(); + } + + private ModuleLoader getCurrentLoader() { + ModuleRevision current = getCurrentRevision(); + if (current == null) { + return null; + } + ModuleWiring wiring = current.getWiring(); + if (wiring == null) { + return null; + } + return wiring.getModuleLoader(); + } + /** * Performs any work associated with starting a module. For example, * loading and calling start on an activator. diff --git a/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/container/ModuleLoader.java b/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/container/ModuleLoader.java index bdd2e8176..334819ac7 100644 --- a/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/container/ModuleLoader.java +++ b/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/container/ModuleLoader.java @@ -43,4 +43,8 @@ public interface ModuleLoader { * @return TODO */ public ClassLoader getClassLoader(); + + public boolean getAndSetTrigger(); + + public boolean isTriggerSet(); } diff --git a/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/internal/loader/BundleLoader.java b/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/internal/loader/BundleLoader.java index 2d1a194db..7cbcae94a 100644 --- a/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/internal/loader/BundleLoader.java +++ b/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/internal/loader/BundleLoader.java @@ -17,6 +17,7 @@ import java.net.URL; import java.security.AccessController; import java.security.PrivilegedAction; import java.util.*; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.eclipse.osgi.container.*; @@ -93,6 +94,7 @@ public class BundleLoader implements ModuleLoader { /* @GuardedBy("classLoaderMonitor") */ private ModuleClassLoader classloader; private final ClassLoader parent; + private final AtomicBoolean triggerClassLoaded = new AtomicBoolean(false); /** * Returns the package name from the specified class name. @@ -1052,4 +1054,14 @@ public class BundleLoader implements ModuleLoader { return super.getClassContext(); } } + + @Override + public boolean getAndSetTrigger() { + return triggerClassLoaded.getAndSet(true); + } + + @Override + public boolean isTriggerSet() { + return triggerClassLoaded.get(); + } } diff --git a/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/internal/loader/FragmentLoader.java b/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/internal/loader/FragmentLoader.java index 77d8b9932..e10ebd8e8 100644 --- a/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/internal/loader/FragmentLoader.java +++ b/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/internal/loader/FragmentLoader.java @@ -21,4 +21,16 @@ public class FragmentLoader implements ModuleLoader { return null; } + @Override + public boolean getAndSetTrigger() { + // nothing to do here + return false; + } + + @Override + public boolean isTriggerSet() { + // nothing to do here + return false; + } + } |