diff options
author | BJ Hargrave | 2005-11-15 22:06:40 +0000 |
---|---|---|
committer | BJ Hargrave | 2005-11-15 22:06:40 +0000 |
commit | 58a9a52ef779932f529074eb2c4771cf53d4fcd0 (patch) | |
tree | 4722287fec1a443264c0fd24e60f9c58540e31af /bundles/org.eclipse.osgi/osgi/src/org/osgi/util | |
parent | 06ff7fe0cfb446cfc4a558692d2cd367e115041e (diff) | |
download | rt.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.java | 42 |
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 { |