Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThomas Watson2013-02-20 17:06:19 +0000
committerThomas Watson2013-02-20 17:06:19 +0000
commitc635eaa22497b936f24ad94557b9b8b1f2d146dc (patch)
treeb533afc8ee7a0c16744f0253a9e2c71612acd47e /bundles
parent54e1b1dcbcb07728f2f8cf5640905980e8d6796e (diff)
downloadrt.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')
-rw-r--r--bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/container/Module.java27
-rw-r--r--bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/container/ModuleLoader.java4
-rw-r--r--bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/internal/loader/BundleLoader.java12
-rw-r--r--bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/internal/loader/FragmentLoader.java12
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;
+ }
+
}

Back to the top