diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassSpecialization.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassSpecialization.java index f8448c63acc..0e7fb8901b1 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassSpecialization.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassSpecialization.java @@ -64,14 +64,22 @@ public class CPPClassSpecialization extends CPPSpecialization } public IBinding specializeMember(IBinding original) { - IBinding result= (IBinding) specializationMap.get(original); - if (result == null) { - result= CPPTemplates.createSpecialization(this, original, argumentMap); + synchronized(this) { + IBinding result= (IBinding) specializationMap.get(original); + 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) specializationMap = new ObjectMap(2); specializationMap.put(original, result); + return result; } - return result; } private class FindDefinitionAction extends CPPASTVisitor { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassTemplateSpecialization.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassTemplateSpecialization.java index 576c2f19034..3e4ab6761be 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassTemplateSpecialization.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassTemplateSpecialization.java @@ -49,13 +49,13 @@ public class CPPClassTemplateSpecialization extends CPPClassSpecialization return template.getTemplateParameters(); } - public void addInstance(IType[] arguments, ICPPTemplateInstance instance) { + public synchronized void addInstance(IType[] arguments, ICPPTemplateInstance instance) { if (instances == null) instances = new ObjectMap(2); instances.put(arguments, instance); } - public ICPPTemplateInstance getInstance(IType[] arguments) { + public synchronized ICPPTemplateInstance getInstance(IType[] arguments) { if (instances != null) { loop: for (int i=0; i < instances.size(); i++) { IType[] args = (IType[]) instances.keyAt(i); @@ -72,7 +72,7 @@ public class CPPClassTemplateSpecialization extends CPPClassSpecialization return null; } - public ICPPTemplateInstance[] getAllInstances() { + public synchronized ICPPTemplateInstance[] getAllInstances() { if (instances != null) { ICPPTemplateInstance[] result= new ICPPTemplateInstance[instances.size()]; for (int i=0; i < instances.size(); i++) { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPFunctionTemplateSpecialization.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPFunctionTemplateSpecialization.java index 81fbe76fe65..c9ae10589e4 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPFunctionTemplateSpecialization.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPFunctionTemplateSpecialization.java @@ -39,13 +39,13 @@ public class CPPFunctionTemplateSpecialization extends CPPFunctionSpecialization return template.getTemplateParameters(); } - public final void addInstance(IType[] arguments, ICPPTemplateInstance instance) { + public synchronized final void addInstance(IType[] arguments, ICPPTemplateInstance instance) { if (instances == null) instances = new ObjectMap(2); instances.put(arguments, instance); } - public final ICPPTemplateInstance getInstance(IType[] arguments) { + public synchronized final ICPPTemplateInstance getInstance(IType[] arguments) { if (instances != null) { loop: for (int i=0; i < instances.size(); i++) { IType[] args = (IType[]) instances.keyAt(i); @@ -62,7 +62,7 @@ public class CPPFunctionTemplateSpecialization extends CPPFunctionSpecialization return null; } - public ICPPTemplateInstance[] getAllInstances() { + public synchronized ICPPTemplateInstance[] getAllInstances() { if (instances != null) { ICPPTemplateInstance[] result= new ICPPTemplateInstance[instances.size()]; for (int i=0; i < instances.size(); i++) {