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:
parent
e1dc796f80
commit
09fdb56cc2
3 changed files with 18 additions and 10 deletions
|
@ -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 {
|
||||||
|
|
|
@ -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++) {
|
||||||
|
|
|
@ -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++) {
|
||||||
|
|
Loading…
Add table
Reference in a new issue