Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBJ Hargrave2005-11-15 22:06:40 +0000
committerBJ Hargrave2005-11-15 22:06:40 +0000
commit58a9a52ef779932f529074eb2c4771cf53d4fcd0 (patch)
tree4722287fec1a443264c0fd24e60f9c58540e31af /bundles/org.eclipse.osgi/osgi/src/org/osgi/util
parent06ff7fe0cfb446cfc4a558692d2cd367e115041e (diff)
downloadrt.equinox.framework-58a9a52ef779932f529074eb2c4771cf53d4fcd0.tar.gz
rt.equinox.framework-58a9a52ef779932f529074eb2c4771cf53d4fcd0.tar.xz
rt.equinox.framework-58a9a52ef779932f529074eb2c4771cf53d4fcd0.zip
An error still existed where a service could be tracked twice or be in adding twice. Additional check were added to trackInitialServices
Diffstat (limited to 'bundles/org.eclipse.osgi/osgi/src/org/osgi/util')
-rw-r--r--bundles/org.eclipse.osgi/osgi/src/org/osgi/util/tracker/ServiceTracker.java42
1 files changed, 31 insertions, 11 deletions
diff --git a/bundles/org.eclipse.osgi/osgi/src/org/osgi/util/tracker/ServiceTracker.java b/bundles/org.eclipse.osgi/osgi/src/org/osgi/util/tracker/ServiceTracker.java
index 92b05a80c..a82abadfa 100644
--- a/bundles/org.eclipse.osgi/osgi/src/org/osgi/util/tracker/ServiceTracker.java
+++ b/bundles/org.eclipse.osgi/osgi/src/org/osgi/util/tracker/ServiceTracker.java
@@ -1,5 +1,5 @@
/*
- * $Header: /cvshome/build/org.osgi.util.tracker/src/org/osgi/util/tracker/ServiceTracker.java,v 1.16 2005/11/15 19:01:44 hargrave Exp $
+ * $Header: /cvshome/build/org.osgi.util.tracker/src/org/osgi/util/tracker/ServiceTracker.java,v 1.17 2005/11/15 22:05:30 hargrave Exp $
*
* Copyright (c) OSGi Alliance (2000, 2005). All Rights Reserved.
*
@@ -33,7 +33,7 @@ import org.osgi.framework.*;
* <code>getServices</code> methods can be called to get the service objects
* for the tracked service.
*
- * @version $Revision: 1.16 $
+ * @version $Revision: 1.17 $
*/
public class ServiceTracker implements ServiceTrackerCustomizer {
/* set this to true to compile in debug messages */
@@ -836,10 +836,10 @@ public class ServiceTracker implements ServiceTrackerCustomizer {
while (true) {
ServiceReference reference;
synchronized (this) {
- if (initial.size() == 0) { /*
- * if there are no more inital
- * services
- */
+ if (initial.size() == 0) {
+ /*
+ * if there are no more inital services
+ */
return; /* we are done */
}
/*
@@ -847,6 +847,25 @@ public class ServiceTracker implements ServiceTrackerCustomizer {
* adding list within this synchronized block.
*/
reference = (ServiceReference) initial.removeFirst();
+ if (this.get(reference) != null) {
+ /* if we are already tracking this service */
+ if (DEBUG) {
+ System.out
+ .println("ServiceTracker.Tracked.trackInitialServices[already tracked]: " + reference); //$NON-NLS-1$
+ }
+ continue; /* skip this service */
+ }
+ if (adding.contains(reference)) {
+ /*
+ * if this service is already in the process of being
+ * added.
+ */
+ if (DEBUG) {
+ System.out
+ .println("ServiceTracker.Tracked.trackInitialServices[already adding]: " + reference); //$NON-NLS-1$
+ }
+ continue; /* skip this service */
+ }
adding.add(reference);
}
if (DEBUG) {
@@ -893,10 +912,8 @@ public class ServiceTracker implements ServiceTrackerCustomizer {
switch (event.getType()) {
case ServiceEvent.REGISTERED :
case ServiceEvent.MODIFIED :
- if (listenerFilter != null) { /*
- * constructor supplied
- * filter
- */
+ if (listenerFilter != null) { // constructor supplied
+ // filter
track(reference);
/*
* If the customizer throws an unchecked exception, it
@@ -1007,7 +1024,10 @@ public class ServiceTracker implements ServiceTrackerCustomizer {
if (object != null) {
this.put(reference, object);
modified(); /* increment modification count */
- notifyAll();
+ notifyAll(); /*
+ * notify any waiters in
+ * waitForService
+ */
}
}
else {

Back to the top