diff options
Diffstat (limited to 'providers/bundles')
2 files changed, 35 insertions, 8 deletions
diff --git a/providers/bundles/org.eclipse.ecf.provider.remoteservice/META-INF/MANIFEST.MF b/providers/bundles/org.eclipse.ecf.provider.remoteservice/META-INF/MANIFEST.MF index 6edc59864..da70028af 100644 --- a/providers/bundles/org.eclipse.ecf.provider.remoteservice/META-INF/MANIFEST.MF +++ b/providers/bundles/org.eclipse.ecf.provider.remoteservice/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %pluginName Bundle-SymbolicName: org.eclipse.ecf.provider.remoteservice;singleton:=true -Bundle-Version: 4.2.100.qualifier +Bundle-Version: 4.2.200.qualifier Bundle-Activator: org.eclipse.ecf.internal.provider.remoteservice.Activator Bundle-Vendor: %providerName Bundle-Localization: plugin diff --git a/providers/bundles/org.eclipse.ecf.provider.remoteservice/src/org/eclipse/ecf/provider/remoteservice/generic/RegistrySharedObject.java b/providers/bundles/org.eclipse.ecf.provider.remoteservice/src/org/eclipse/ecf/provider/remoteservice/generic/RegistrySharedObject.java index 27d7e2a54..60b3c3d86 100644 --- a/providers/bundles/org.eclipse.ecf.provider.remoteservice/src/org/eclipse/ecf/provider/remoteservice/generic/RegistrySharedObject.java +++ b/providers/bundles/org.eclipse.ecf.provider.remoteservice/src/org/eclipse/ecf/provider/remoteservice/generic/RegistrySharedObject.java @@ -493,6 +493,8 @@ public class RegistrySharedObject extends BaseSharedObject implements IRemoteSer } synchronized (localRegistry) { localRegistry.unpublishServices(); + } + synchronized (localRegistryUnregistrationTargets) { localRegistryUnregistrationTargets.clear(); } super.dispose(containerID); @@ -711,6 +713,23 @@ public class RegistrySharedObject extends BaseSharedObject implements IRemoteSer } } + private void removeUnregistrationTarget(ID targetID) { + // reg -> List<ID> + synchronized (localRegistryUnregistrationTargets) { + for (Iterator i = this.localRegistryUnregistrationTargets.keySet().iterator(); i.hasNext();) { + RemoteServiceRegistrationImpl reg = (RemoteServiceRegistrationImpl) i.next(); + List targets = (List) this.localRegistryUnregistrationTargets.get(reg); + for (Iterator t = targets.iterator(); t.hasNext();) { + ID unregTarget = (ID) t.next(); + if (targetID.equals(unregTarget)) + t.remove(); + } + if (targets.isEmpty()) + i.remove(); + } + } + } + private void handleTargetGoneEvent(ID targetID) { RemoteServiceRegistrationImpl registrations[] = null; synchronized (remoteRegistrys) { @@ -725,6 +744,9 @@ public class RegistrySharedObject extends BaseSharedObject implements IRemoteSer } } } + + // remove from localRegistryUnregistrationTargets + removeUnregistrationTarget(targetID); // Remove from pending updates removePendingContainers(targetID); @@ -1624,13 +1646,15 @@ public class RegistrySharedObject extends BaseSharedObject implements IRemoteSer @SuppressWarnings("unchecked") private void addTargetForUnregister(RemoteServiceRegistrationImpl serviceRegistration, ID targetContainerID) { - List existingTargets = (List) localRegistryUnregistrationTargets.get(serviceRegistration); - if (existingTargets == null) { - existingTargets = new ArrayList(); + synchronized (localRegistryUnregistrationTargets) { + List existingTargets = (List) localRegistryUnregistrationTargets.get(serviceRegistration); + if (existingTargets == null) { + existingTargets = new ArrayList(); + } + existingTargets.add(targetContainerID); + Trace.trace(Activator.PLUGIN_ID, "addTargetForUnregister localContainerID=" + getLocalContainerID() + ",targetContainerID=" + targetContainerID + ",serviceRegistration=" + serviceRegistration); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + localRegistryUnregistrationTargets.put(serviceRegistration, existingTargets); } - existingTargets.add(targetContainerID); - Trace.trace(Activator.PLUGIN_ID, "addTargetForUnregister localContainerID=" + getLocalContainerID() + ",targetContainerID=" + targetContainerID + ",serviceRegistration=" + serviceRegistration); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - localRegistryUnregistrationTargets.put(serviceRegistration, existingTargets); } @SuppressWarnings("unchecked") @@ -1641,7 +1665,10 @@ public class RegistrySharedObject extends BaseSharedObject implements IRemoteSer allTargets.addAll(Arrays.asList(otherTargets)); } // Then add any explicitly registered targets - List registeredTargets = (List) localRegistryUnregistrationTargets.remove(serviceRegistration); + List registeredTargets = null; + synchronized (localRegistryUnregistrationTargets) { + registeredTargets = (List) localRegistryUnregistrationTargets.remove(serviceRegistration); + } if (registeredTargets != null) { allTargets.addAll(registeredTargets); } |