1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-07-31 21:05:37 +02:00

Bug 499696 - add synchronization to service maps

Change-Id: I64775d4976c96a20bee934cf024064ef18896be9
Signed-off-by: Greg Watson <g.watson@computer.org>
This commit is contained in:
Greg Watson 2016-08-15 16:24:39 -04:00
parent 707299e380
commit a50bad7272

View file

@ -148,29 +148,33 @@ public class RemoteConnectionType implements IRemoteConnectionType {
* @see org.eclipse.remote.core.IRemoteConnectionType#getService(java.lang.Class) * @see org.eclipse.remote.core.IRemoteConnectionType#getService(java.lang.Class)
*/ */
@Override @Override
public <T extends Service> T getService(Class<T> service) { public <T extends Service> T getService(Class<T> service) {
@SuppressWarnings("unchecked") synchronized (serviceDefinitionMap) {
T obj = (T) serviceMap.get(service); @SuppressWarnings("unchecked")
if (obj == null) { T obj = (T) serviceMap.get(service);
IConfigurationElement ce = serviceDefinitionMap.get(service.getName()); if (obj == null) {
if (ce != null) { IConfigurationElement ce = serviceDefinitionMap.get(service.getName());
try { if (ce != null) {
Service.Factory factory = (Service.Factory) ce.createExecutableExtension("factory"); //$NON-NLS-1$ try {
if (factory != null) { Service.Factory factory = (Service.Factory) ce.createExecutableExtension("factory"); //$NON-NLS-1$
obj = factory.getService(this, service); if (factory != null) {
serviceMap.put(service, obj); obj = factory.getService(this, service);
serviceMap.put(service, obj);
}
} catch (CoreException e) {
RemoteCorePlugin.log(e.getStatus());
} }
} catch (CoreException e) {
RemoteCorePlugin.log(e.getStatus());
} }
} }
return obj;
} }
return obj;
} }
@Override @Override
public List<String> getServices() { public List<String> getServices() {
return new ArrayList<>(serviceDefinitionMap.keySet()); synchronized (serviceDefinitionMap) {
return new ArrayList<>(serviceDefinitionMap.keySet());
}
} }
/* /*
@ -180,7 +184,9 @@ public class RemoteConnectionType implements IRemoteConnectionType {
*/ */
@Override @Override
public <T extends Service> boolean hasService(Class<T> service) { public <T extends Service> boolean hasService(Class<T> service) {
return serviceDefinitionMap.get(service.getName()) != null; synchronized (serviceDefinitionMap) {
return serviceDefinitionMap.get(service.getName()) != null;
}
} }
/** /**
@ -194,25 +200,28 @@ public class RemoteConnectionType implements IRemoteConnectionType {
* @throws CoreException * @throws CoreException
*/ */
public <T extends IRemoteConnection.Service> T getConnectionService(IRemoteConnection connection, Class<T> service) { public <T extends IRemoteConnection.Service> T getConnectionService(IRemoteConnection connection, Class<T> service) {
IConfigurationElement ce = connectionServiceDefinitionMap.get(service.getName()); synchronized (connectionServiceDefinitionMap) {
if (ce != null) { IConfigurationElement ce = connectionServiceDefinitionMap.get(service.getName());
try { if (ce != null) {
IRemoteConnection.Service.Factory factory = (IRemoteConnection.Service.Factory) ce try {
.createExecutableExtension("factory"); //$NON-NLS-1$ IRemoteConnection.Service.Factory factory = (IRemoteConnection.Service.Factory) ce
if (factory != null) { .createExecutableExtension("factory"); //$NON-NLS-1$
return factory.getService(connection, service); if (factory != null) {
return factory.getService(connection, service);
}
} catch (CoreException e) {
RemoteCorePlugin.log(e.getStatus());
} }
} catch (CoreException e) {
RemoteCorePlugin.log(e.getStatus());
} }
return null;
} }
return null;
} }
@Override @Override
public List<String> getConnectionServices() { public List<String> getConnectionServices() {
return new ArrayList<>(connectionServiceDefinitionMap.keySet()); synchronized (connectionServiceDefinitionMap) {
return new ArrayList<>(connectionServiceDefinitionMap.keySet());
}
} }
/* /*
@ -222,7 +231,9 @@ public class RemoteConnectionType implements IRemoteConnectionType {
*/ */
@Override @Override
public <T extends IRemoteConnection.Service> boolean hasConnectionService(Class<T> service) { public <T extends IRemoteConnection.Service> boolean hasConnectionService(Class<T> service) {
return connectionServiceDefinitionMap.get(service.getName()) != null; synchronized (connectionServiceDefinitionMap) {
return connectionServiceDefinitionMap.get(service.getName()) != null;
}
} }
/** /**
@ -236,24 +247,27 @@ public class RemoteConnectionType implements IRemoteConnectionType {
* @throws CoreException * @throws CoreException
*/ */
public <T extends IRemoteProcess.Service> T getProcessService(IRemoteProcess process, Class<T> service) { public <T extends IRemoteProcess.Service> T getProcessService(IRemoteProcess process, Class<T> service) {
IConfigurationElement ce = processServiceDefinitionMap.get(service.getName()); synchronized (processServiceDefinitionMap) {
if (ce != null) { IConfigurationElement ce = processServiceDefinitionMap.get(service.getName());
try { if (ce != null) {
IRemoteProcess.Service.Factory factory = (IRemoteProcess.Service.Factory) ce.createExecutableExtension("factory"); //$NON-NLS-1$ try {
if (factory != null) { IRemoteProcess.Service.Factory factory = (IRemoteProcess.Service.Factory) ce.createExecutableExtension("factory"); //$NON-NLS-1$
return factory.getService(process, service); if (factory != null) {
return factory.getService(process, service);
}
} catch (CoreException e) {
RemoteCorePlugin.log(e.getStatus());
} }
} catch (CoreException e) {
RemoteCorePlugin.log(e.getStatus());
} }
return null;
} }
return null;
} }
@Override @Override
public List<String> getProcessServices() { public List<String> getProcessServices() {
return new ArrayList<>(processServiceDefinitionMap.keySet()); synchronized (processServiceDefinitionMap) {
return new ArrayList<>(processServiceDefinitionMap.keySet());
}
} }
/* /*
@ -263,7 +277,9 @@ public class RemoteConnectionType implements IRemoteConnectionType {
*/ */
@Override @Override
public <T extends IRemoteProcess.Service> boolean hasProcessService(Class<T> service) { public <T extends IRemoteProcess.Service> boolean hasProcessService(Class<T> service) {
return processServiceDefinitionMap.get(service.getName()) != null; synchronized (processServiceDefinitionMap) {
return processServiceDefinitionMap.get(service.getName()) != null;
}
} }
/** /**
@ -301,7 +317,7 @@ public class RemoteConnectionType implements IRemoteConnectionType {
} }
/** /**
* Signal a connnection is about to be removed. * Signal a connection is about to be removed.
* *
* @since 2.0 * @since 2.0
*/ */