1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-07-31 12:55:40 +02:00

Concurrent usage of specializations, bug 245460.

This commit is contained in:
Markus Schorn 2008-10-14 12:20:42 +00:00
parent e1dc796f80
commit 09fdb56cc2
3 changed files with 18 additions and 10 deletions

View file

@ -64,14 +64,22 @@ public class CPPClassSpecialization extends CPPSpecialization
} }
public IBinding specializeMember(IBinding original) { public IBinding specializeMember(IBinding original) {
IBinding result= (IBinding) specializationMap.get(original); synchronized(this) {
if (result == null) { IBinding result= (IBinding) specializationMap.get(original);
result= CPPTemplates.createSpecialization(this, original, argumentMap); if (result != null)
return result;
}
IBinding result= CPPTemplates.createSpecialization(this, original, argumentMap);
synchronized(this) {
IBinding concurrent= (IBinding) specializationMap.get(original);
if (concurrent != null)
return concurrent;
if (specializationMap == ObjectMap.EMPTY_MAP) if (specializationMap == ObjectMap.EMPTY_MAP)
specializationMap = new ObjectMap(2); specializationMap = new ObjectMap(2);
specializationMap.put(original, result); specializationMap.put(original, result);
return result;
} }
return result;
} }
private class FindDefinitionAction extends CPPASTVisitor { private class FindDefinitionAction extends CPPASTVisitor {

View file

@ -49,13 +49,13 @@ public class CPPClassTemplateSpecialization extends CPPClassSpecialization
return template.getTemplateParameters(); return template.getTemplateParameters();
} }
public void addInstance(IType[] arguments, ICPPTemplateInstance instance) { public synchronized void addInstance(IType[] arguments, ICPPTemplateInstance instance) {
if (instances == null) if (instances == null)
instances = new ObjectMap(2); instances = new ObjectMap(2);
instances.put(arguments, instance); instances.put(arguments, instance);
} }
public ICPPTemplateInstance getInstance(IType[] arguments) { public synchronized ICPPTemplateInstance getInstance(IType[] arguments) {
if (instances != null) { if (instances != null) {
loop: for (int i=0; i < instances.size(); i++) { loop: for (int i=0; i < instances.size(); i++) {
IType[] args = (IType[]) instances.keyAt(i); IType[] args = (IType[]) instances.keyAt(i);
@ -72,7 +72,7 @@ public class CPPClassTemplateSpecialization extends CPPClassSpecialization
return null; return null;
} }
public ICPPTemplateInstance[] getAllInstances() { public synchronized ICPPTemplateInstance[] getAllInstances() {
if (instances != null) { if (instances != null) {
ICPPTemplateInstance[] result= new ICPPTemplateInstance[instances.size()]; ICPPTemplateInstance[] result= new ICPPTemplateInstance[instances.size()];
for (int i=0; i < instances.size(); i++) { for (int i=0; i < instances.size(); i++) {

View file

@ -39,13 +39,13 @@ public class CPPFunctionTemplateSpecialization extends CPPFunctionSpecialization
return template.getTemplateParameters(); return template.getTemplateParameters();
} }
public final void addInstance(IType[] arguments, ICPPTemplateInstance instance) { public synchronized final void addInstance(IType[] arguments, ICPPTemplateInstance instance) {
if (instances == null) if (instances == null)
instances = new ObjectMap(2); instances = new ObjectMap(2);
instances.put(arguments, instance); instances.put(arguments, instance);
} }
public final ICPPTemplateInstance getInstance(IType[] arguments) { public synchronized final ICPPTemplateInstance getInstance(IType[] arguments) {
if (instances != null) { if (instances != null) {
loop: for (int i=0; i < instances.size(); i++) { loop: for (int i=0; i < instances.size(); i++) {
IType[] args = (IType[]) instances.keyAt(i); IType[] args = (IType[]) instances.keyAt(i);
@ -62,7 +62,7 @@ public class CPPFunctionTemplateSpecialization extends CPPFunctionSpecialization
return null; return null;
} }
public ICPPTemplateInstance[] getAllInstances() { public synchronized ICPPTemplateInstance[] getAllInstances() {
if (instances != null) { if (instances != null) {
ICPPTemplateInstance[] result= new ICPPTemplateInstance[instances.size()]; ICPPTemplateInstance[] result= new ICPPTemplateInstance[instances.size()];
for (int i=0; i < instances.size(); i++) { for (int i=0; i < instances.size(); i++) {