From 09fdb56cc209df336797fba6a5c544f82b8148a2 Mon Sep 17 00:00:00 2001 From: Markus Schorn Date: Tue, 14 Oct 2008 12:20:42 +0000 Subject: [PATCH] Concurrent usage of specializations, bug 245460. --- .../dom/parser/cpp/CPPClassSpecialization.java | 16 ++++++++++++---- .../cpp/CPPClassTemplateSpecialization.java | 6 +++--- .../cpp/CPPFunctionTemplateSpecialization.java | 6 +++--- 3 files changed, 18 insertions(+), 10 deletions(-) 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++) {