From ffd5ae3839d381443926728886669ffcd8c8b913 Mon Sep 17 00:00:00 2001 From: Markus Schorn Date: Fri, 1 Apr 2011 09:08:56 +0000 Subject: Bug 341440: Thread safety for PDOM objects. --- .../internal/core/dom/parser/c/CFunctionType.java | 7 +++--- .../cpp/AbstractCPPClassSpecializationScope.java | 5 ++-- .../core/dom/parser/cpp/CPPFunctionType.java | 18 ++++++-------- .../core/dom/parser/cpp/CPPUnknownScope.java | 29 ++++++++++++++++------ .../cdt/internal/core/pdom/dom/PDOMFile.java | 2 +- .../cdt/internal/core/pdom/dom/PDOMLinkage.java | 2 +- .../cdt/internal/core/pdom/dom/PDOMNamedNode.java | 4 +-- .../cdt/internal/core/pdom/dom/PDOMNode.java | 2 +- .../internal/core/pdom/dom/c/PDOMCEnumeration.java | 6 ++--- .../core/pdom/dom/cpp/PDOMCPPClassScope.java | 3 ++- .../pdom/dom/cpp/PDOMCPPClassSpecialization.java | 7 +++--- .../core/pdom/dom/cpp/PDOMCPPClassTemplate.java | 4 +-- ...emplatePartialSpecializationSpecialization.java | 4 +-- .../core/pdom/dom/cpp/PDOMCPPClassType.java | 4 +-- .../pdom/dom/cpp/PDOMCPPDeferredClassInstance.java | 2 +- .../core/pdom/dom/cpp/PDOMCPPEnumScope.java | 5 ++-- .../core/pdom/dom/cpp/PDOMCPPEnumeration.java | 10 ++++---- .../core/pdom/dom/cpp/PDOMCPPFunction.java | 4 +-- .../dom/cpp/PDOMCPPFunctionSpecialization.java | 5 ++-- .../core/pdom/dom/cpp/PDOMCPPFunctionTemplate.java | 4 +-- .../internal/core/pdom/dom/cpp/PDOMCPPLinkage.java | 5 ++-- .../core/pdom/dom/cpp/PDOMCPPNamespace.java | 2 +- .../core/pdom/dom/cpp/PDOMCPPSpecialization.java | 7 +++--- .../dom/cpp/PDOMCPPTemplateNonTypeParameter.java | 4 +-- .../dom/cpp/PDOMCPPTemplateTemplateParameter.java | 6 ++--- .../pdom/dom/cpp/PDOMCPPTemplateTypeParameter.java | 4 +-- .../pdom/dom/cpp/PDOMCPPUnknownClassInstance.java | 4 +-- .../core/pdom/dom/cpp/PDOMCPPUnknownClassType.java | 4 +-- .../core/pdom/dom/cpp/PDOMCPPUnknownScope.java | 12 ++++++--- .../core/pdom/dom/cpp/PDOMCPPUsingDeclaration.java | 4 +-- 30 files changed, 100 insertions(+), 79 deletions(-) diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CFunctionType.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CFunctionType.java index 2750acc26c0..bf49918cb5b 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CFunctionType.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CFunctionType.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2004, 2010 IBM Corporation and others. + * Copyright (c) 2004, 2011 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -7,6 +7,7 @@ * * Contributors: * Devin Steffler (IBM Corporation) - initial API and implementation + * Markus Schorn (Wind River Systems) *******************************************************************************/ package org.eclipse.cdt.internal.core.dom.parser.c; @@ -18,8 +19,8 @@ import org.eclipse.cdt.internal.core.dom.parser.ITypeMarshalBuffer; import org.eclipse.core.runtime.CoreException; public class CFunctionType implements IFunctionType, ISerializableType { - IType[] parameters = null; - IType returnType = null; + private final IType[] parameters; + private final IType returnType; public CFunctionType( IType returnType, IType [] types ) { this.returnType = returnType; diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/AbstractCPPClassSpecializationScope.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/AbstractCPPClassSpecializationScope.java index e8c7d3f2bc2..77aadcda2b9 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/AbstractCPPClassSpecializationScope.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/AbstractCPPClassSpecializationScope.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2005, 2010 IBM Corporation and others. + * Copyright (c) 2005, 2011 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -41,10 +41,11 @@ import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.SemanticUtil; /** * Base class for all specialization scopes + * For safe usage in index bindings, all fields need to be final or volatile. */ public class AbstractCPPClassSpecializationScope implements ICPPClassSpecializationScope { final private ICPPClassSpecialization specialClass; - private ICPPBase[] fBases; + private volatile ICPPBase[] fBases; // Used by the pdom bindings, needs to be volatile. public AbstractCPPClassSpecializationScope(ICPPClassSpecialization specialization) { this.specialClass= specialization; diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPFunctionType.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPFunctionType.java index 413d1f954aa..f46908ecffb 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPFunctionType.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPFunctionType.java @@ -23,21 +23,17 @@ import org.eclipse.core.runtime.CoreException; /** * Represents c++ function types. Note that we keep typedefs as part of the function type. + * For safe usage in index bindings, all fields need to be final. */ public class CPPFunctionType implements ICPPFunctionType, ISerializableType { - private IType[] parameters; - private IType returnType; - private boolean isConst; - private boolean isVolatile; - private boolean takesVarargs; + private final IType[] parameters; + private final IType returnType; + private final boolean isConst; + private final boolean isVolatile; + private final boolean takesVarargs; - /** - * @param returnType - * @param types - */ public CPPFunctionType(IType returnType, IType[] types) { - this.returnType = returnType; - this.parameters = types; + this(returnType, types, false, false, false); } public CPPFunctionType(IType returnType, IType[] types, boolean isConst, boolean isVolatile, diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPUnknownScope.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPUnknownScope.java index 6bfd13c52f2..20ca20dedd2 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPUnknownScope.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPUnknownScope.java @@ -35,10 +35,15 @@ import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPSemantics; /** * Models the scope represented by an unknown binding such (e.g.: template type parameter). Used within * the context of templates, only. + * For safe usage in index bindings, all fields need to be final or used in a thread-safe manner otherwise. */ public class CPPUnknownScope implements ICPPInternalUnknownScope { private final ICPPUnknownBinding binding; private final IASTName scopeName; + /** + * This field needs to be protected when used in PDOMCPPUnknownScope, + * don't use it outside of {@link #getOrCreateBinding(IASTName, int)} + */ private CharArrayObjectMap map; public CPPUnknownScope(ICPPUnknownBinding binding, IASTName name) { @@ -131,7 +136,14 @@ public class CPPUnknownScope implements ICPPInternalUnknownScope { } } - if (map == null) + int idx= type ? 0 : function ? 1 : 2; + + IBinding result = getOrCreateBinding(name, idx); + return result; + } + + protected IBinding getOrCreateBinding(final IASTName name, int idx) { + if (map == null) map = new CharArrayObjectMap(2); final char[] c = name.getLookupKey(); @@ -141,20 +153,23 @@ public class CPPUnknownScope implements ICPPInternalUnknownScope { map.put(c, o); } - int idx= type ? 0 : function ? 1 : 2; IBinding result= o[idx]; if (result == null) { - if (type) { + switch (idx) { + case 0: result= new CPPUnknownClass(binding, name.getSimpleID()); - } else if (function) { + break; + case 1: result= new CPPUnknownFunction(binding, name.getSimpleID()); - } else { + break; + case 2: result= new CPPUnknownBinding(binding, name.getSimpleID()); + break; } o[idx]= result; } - return result; - } + return result; + } public final IBinding[] getBindings(IASTName name, boolean resolve, boolean prefix) { return getBindings(name, resolve, prefix, IIndexFileSet.EMPTY); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMFile.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMFile.java index db71c52305d..e02713c5426 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMFile.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMFile.java @@ -62,7 +62,7 @@ import org.eclipse.core.runtime.Status; public class PDOMFile implements IIndexFragmentFile { private final PDOMLinkage fLinkage; private final long record; - private IIndexFileLocation location; + private IIndexFileLocation location; // No need to make volatile, all fields of IIndexFileLocation are final. private static final int FIRST_NAME = 0; private static final int FIRST_INCLUDE = 4; diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMLinkage.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMLinkage.java index 6df8cd0297d..33d71c804e5 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMLinkage.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMLinkage.java @@ -70,7 +70,7 @@ public abstract class PDOMLinkage extends PDOMNamedNode implements IIndexLinkage // node types protected static final int LINKAGE= 0; // special one for myself - private BTree fMacroIndex= null; + private BTree fMacroIndex= null; // No need for volatile, all fields of BTree are final. private final PDOM fPDOM; private final Database fDatabase; diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMNamedNode.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMNamedNode.java index 92acdcf2456..2c0fe31c7e5 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMNamedNode.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMNamedNode.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2006, 2010 QNX Software Systems and others. + * Copyright (c) 2006, 2011 QNX Software Systems and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -38,7 +38,7 @@ public abstract class PDOMNamedNode extends PDOMNode { @SuppressWarnings("hiding") protected static final int RECORD_SIZE = PDOMNode.RECORD_SIZE + 4; - private char[] fName; + private volatile char[] fName; public PDOMNamedNode(PDOMLinkage linkage, long record) { super(linkage, record); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMNode.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMNode.java index ec62f33e867..49409e4ce80 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMNode.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMNode.java @@ -32,7 +32,7 @@ public abstract class PDOMNode implements IInternalPDOMNode { private final PDOMLinkage fLinkage; protected final long record; - private long cachedParentRecord; + private volatile long cachedParentRecord; protected PDOMNode(PDOMLinkage linkage, long record) { fLinkage = linkage; diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/c/PDOMCEnumeration.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/c/PDOMCEnumeration.java index 02244f62cb4..10c58ac4cac 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/c/PDOMCEnumeration.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/c/PDOMCEnumeration.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2006, 2010 QNX Software Systems and others. + * Copyright (c) 2006, 2011 QNX Software Systems and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -42,8 +42,8 @@ class PDOMCEnumeration extends PDOMBinding implements IEnumeration, IIndexType { @SuppressWarnings("hiding") protected static final int RECORD_SIZE = OFFSET_MAX_VALUE + 8; - private Long fMinValue; - private Long fMaxValue; + private Long fMinValue; // No need for volatile, all fields of Long are final. + private Long fMaxValue; // No need for volatile, all fields of Long are final. public PDOMCEnumeration(PDOMLinkage linkage, PDOMNode parent, IEnumeration enumeration) throws CoreException { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassScope.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassScope.java index 8ded17fb4c5..3c36369abff 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassScope.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassScope.java @@ -56,6 +56,7 @@ import org.eclipse.core.runtime.CoreException; /** * Represents the class scope for a class stored in the index. + * For safe use, all fields need to be final. */ class PDOMCPPClassScope implements ICPPClassScope, IIndexScope { private static final class PopulateMap implements IPDOMVisitor { @@ -93,7 +94,7 @@ class PDOMCPPClassScope implements ICPPClassScope, IIndexScope { } }; - private IPDOMCPPClassType fBinding; + private final IPDOMCPPClassType fBinding; public PDOMCPPClassScope(IPDOMCPPClassType binding) { fBinding= binding; diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassSpecialization.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassSpecialization.java index 6918f243b50..1b65fc663d3 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassSpecialization.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassSpecialization.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2007, 2010 QNX Software Systems and others. + * Copyright (c) 2007, 2011 QNX Software Systems and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -59,8 +59,9 @@ class PDOMCPPClassSpecialization extends PDOMCPPSpecialization implements */ @SuppressWarnings("hiding") protected static final int RECORD_SIZE = PDOMCPPSpecialization.RECORD_SIZE + 8; - private ICPPClassScope fScope; - private ObjectMap specializationMap= null; + + private volatile ICPPClassScope fScope; + private ObjectMap specializationMap= null; // Obtained from the synchronized PDOM cache public PDOMCPPClassSpecialization(PDOMLinkage linkage, PDOMNode parent, ICPPClassType classType, PDOMBinding specialized) throws CoreException { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassTemplate.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassTemplate.java index 384de439beb..cb9d3a847a3 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassTemplate.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassTemplate.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2007, 2010 QNX Software Systems and others. + * Copyright (c) 2007, 2011 QNX Software Systems and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -59,7 +59,7 @@ public class PDOMCPPClassTemplate extends PDOMCPPClassType @SuppressWarnings("hiding") protected static final int RECORD_SIZE = PDOMCPPClassType.RECORD_SIZE + 10; - private ICPPTemplateParameter[] params; // Cached template parameters. + private volatile ICPPTemplateParameter[] params; // Cached template parameters. public PDOMCPPClassTemplate(PDOMCPPLinkage linkage, PDOMNode parent, ICPPClassTemplate template) throws CoreException, DOMException { super(linkage, parent, template); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassTemplatePartialSpecializationSpecialization.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassTemplatePartialSpecializationSpecialization.java index 44f90f43570..1fe83dd4e0c 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassTemplatePartialSpecializationSpecialization.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassTemplatePartialSpecializationSpecialization.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2009 Wind River Systems, Inc. and others. + * Copyright (c) 2009, 2011 Wind River Systems, Inc. and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -39,7 +39,7 @@ class PDOMCPPClassTemplatePartialSpecializationSpecialization extends PDOMCPPCla @SuppressWarnings("hiding") protected static final int RECORD_SIZE= PDOMCPPClassTemplateSpecialization.RECORD_SIZE+12; - private ICPPClassTemplate fPrimaryTemplate; + private volatile ICPPClassTemplate fPrimaryTemplate; public PDOMCPPClassTemplatePartialSpecializationSpecialization(PDOMCPPLinkage linkage, PDOMNode parent, PDOMBinding specialized, ICPPClassTemplatePartialSpecialization partial, diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassType.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassType.java index a8dcfa6dee9..172ed7a1694 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassType.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassType.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2005, 2010 QNX Software Systems and others. + * Copyright (c) 2005, 2011 QNX Software Systems and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -61,7 +61,7 @@ class PDOMCPPClassType extends PDOMCPPBinding implements IPDOMCPPClassType, IPDO @SuppressWarnings("hiding") protected static final int RECORD_SIZE = PDOMCPPBinding.RECORD_SIZE + 14; - private ICPPClassScope fScope; + private PDOMCPPClassScope fScope; // No need for volatile, all fields of PDOMCPPClassScope are final. public PDOMCPPClassType(PDOMLinkage linkage, PDOMNode parent, ICPPClassType classType) throws CoreException { super(linkage, parent, classType.getNameCharArray()); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPDeferredClassInstance.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPDeferredClassInstance.java index 7f7ac592382..1c853a74f4c 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPDeferredClassInstance.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPDeferredClassInstance.java @@ -56,7 +56,7 @@ class PDOMCPPDeferredClassInstance extends PDOMCPPSpecialization @SuppressWarnings("hiding") protected static final int RECORD_SIZE = PDOMCPPSpecialization.RECORD_SIZE + 8; - private ICPPScope unknownScope; + private PDOMCPPUnknownScope unknownScope; // No need for volatile, PDOMCPPUnknownScope protects its fields. public PDOMCPPDeferredClassInstance(PDOMLinkage linkage, PDOMNode parent, ICPPDeferredClassInstance classType, PDOMBinding instantiated) throws CoreException { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPEnumScope.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPEnumScope.java index 4267361435c..b34a281e2d1 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPEnumScope.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPEnumScope.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2010 Wind River Systems, Inc. and others. + * Copyright (c) 2010, 2011 Wind River Systems, Inc. and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -38,9 +38,10 @@ import org.eclipse.core.runtime.CoreException; /** * Represents the enum scope for an enum stored in the index. + * For safe use all fields need to be final. */ class PDOMCPPEnumScope implements ICPPScope, IIndexScope { - private IPDOMCPPEnumType fBinding; + private final IPDOMCPPEnumType fBinding; public PDOMCPPEnumScope(IPDOMCPPEnumType binding) { fBinding= binding; diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPEnumeration.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPEnumeration.java index 6f3b3cbe6d0..6d935832939 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPEnumeration.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPEnumeration.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2006, 2010 QNX Software Systems and others. + * Copyright (c) 2006, 2011 QNX Software Systems and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -51,10 +51,10 @@ class PDOMCPPEnumeration extends PDOMCPPBinding implements IPDOMCPPEnumType, IPD @SuppressWarnings("hiding") protected static final int RECORD_SIZE = OFFSET_FLAGS + 1; - private Long fMinValue; - private Long fMaxValue; - private IType fFixedType= ProblemBinding.NOT_INITIALIZED; - private PDOMCPPEnumScope fScope; + private Long fMinValue; // No need for volatile, all fields of Long are final. + private Long fMaxValue; // No need for volatile, all fields of Long are final. + private volatile IType fFixedType= ProblemBinding.NOT_INITIALIZED; + private PDOMCPPEnumScope fScope; // No need for volatile, all fields of PDOMCPPEnumScope are final. public PDOMCPPEnumeration(PDOMLinkage linkage, PDOMNode parent, ICPPEnumeration enumeration) throws CoreException { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPFunction.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPFunction.java index 747fabac9fd..765e16e7d88 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPFunction.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPFunction.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2005, 2010 QNX Software Systems and others. + * Copyright (c) 2005, 2011 QNX Software Systems and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -85,7 +85,7 @@ class PDOMCPPFunction extends PDOMCPPBinding implements ICPPFunction, IPDOMOverl private short fAnnotation= -1; private int fRequiredArgCount= -1; - private ICPPFunctionType fType; + private ICPPFunctionType fType; // No need for volatile, all fields of ICPPFunctionTypes are final. public PDOMCPPFunction(PDOMLinkage linkage, PDOMNode parent, ICPPFunction function, boolean setTypes) throws CoreException, DOMException { super(linkage, parent, function.getNameCharArray()); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPFunctionSpecialization.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPFunctionSpecialization.java index ca7872f6fb2..72c2092749d 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPFunctionSpecialization.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPFunctionSpecialization.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2007, 2010 QNX Software Systems and others. + * Copyright (c) 2007, 2011 QNX Software Systems and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -74,9 +74,8 @@ class PDOMCPPFunctionSpecialization extends PDOMCPPSpecialization implements ICP private static final short ANNOT_PARAMETER_PACK = 8; private static final short ANNOT_IS_DELETED = 9; - private ICPPFunctionType fType; + private ICPPFunctionType fType; // No need for volatile, all fields of ICPPFunctionTypes are final. private short fAnnotation= -1; - private int fRequiredArgCount= -1; public PDOMCPPFunctionSpecialization(PDOMLinkage linkage, PDOMNode parent, ICPPFunction astFunction, PDOMBinding specialized) throws CoreException { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPFunctionTemplate.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPFunctionTemplate.java index 0a0e384b3aa..f1ed558d752 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPFunctionTemplate.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPFunctionTemplate.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2007, 2009 QNX Software Systems and others. + * Copyright (c) 2007, 2011 QNX Software Systems and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -41,7 +41,7 @@ class PDOMCPPFunctionTemplate extends PDOMCPPFunction @SuppressWarnings("hiding") protected static final int RECORD_SIZE = TEMPLATE_PARAMS + Database.PTR_SIZE; - private IPDOMCPPTemplateParameter[] params; // Cached template parameters. + private volatile IPDOMCPPTemplateParameter[] params; // Cached template parameters. public PDOMCPPFunctionTemplate(PDOMCPPLinkage linkage, PDOMNode parent, ICPPFunctionTemplate template) throws CoreException, DOMException { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPLinkage.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPLinkage.java index b05090f4226..dd3a89343fa 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPLinkage.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPLinkage.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2005, 2010 QNX Software Systems and others. + * Copyright (c) 2005, 2011 QNX Software Systems and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -114,7 +114,8 @@ class PDOMCPPLinkage extends PDOMLinkage implements IIndexCPPBindingConstants { @SuppressWarnings("hiding") private final static int RECORD_SIZE= FIRST_NAMESPACE_CHILD_OFFSET + Database.PTR_SIZE; - private LinkedList postProcesses = new LinkedList(); + // Only used when writing to database, which is single-threaded + private LinkedList postProcesses = new LinkedList(); public PDOMCPPLinkage(PDOM pdom, long record) { super(pdom, record); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPNamespace.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPNamespace.java index 5078a6a6de1..96a145e1e32 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPNamespace.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPNamespace.java @@ -62,7 +62,7 @@ class PDOMCPPNamespace extends PDOMCPPBinding private static int INLINE_FLAG= 0x1; private int fFlag= -1; - private ICPPNamespaceScope[] fInlineNamespaces; + private volatile ICPPNamespaceScope[] fInlineNamespaces; public PDOMCPPNamespace(PDOMLinkage linkage, PDOMNode parent, ICPPNamespace namespace) throws CoreException { super(linkage, parent, namespace.getNameCharArray()); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPSpecialization.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPSpecialization.java index cda23286dc3..77ba9ae36e1 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPSpecialization.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPSpecialization.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2008, 2009 QNX Software Systems and others. + * Copyright (c) 2008, 2011 QNX Software Systems and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -31,6 +31,7 @@ import org.eclipse.core.runtime.CoreException; * Base class for specializations and instances of other bindings. */ abstract class PDOMCPPSpecialization extends PDOMCPPBinding implements ICPPSpecialization, IPDOMOverloader { + private static final int ARGMAP = PDOMCPPBinding.RECORD_SIZE + 0; private static final int SIGNATURE_HASH = PDOMCPPBinding.RECORD_SIZE + 4; private static final int SPECIALIZED = PDOMCPPBinding.RECORD_SIZE + 8; @@ -40,8 +41,8 @@ abstract class PDOMCPPSpecialization extends PDOMCPPBinding implements ICPPSpeci @SuppressWarnings("hiding") protected static final int RECORD_SIZE = PDOMCPPBinding.RECORD_SIZE + 12; - private IBinding fSpecializedCache= null; - private ICPPTemplateParameterMap fArgMap; + private volatile IBinding fSpecializedCache= null; + private volatile ICPPTemplateParameterMap fArgMap; public PDOMCPPSpecialization(PDOMLinkage linkage, PDOMNode parent, ICPPSpecialization spec, IPDOMBinding specialized) throws CoreException { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPTemplateNonTypeParameter.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPTemplateNonTypeParameter.java index bc0b6da6965..ab3d9cc172f 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPTemplateNonTypeParameter.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPTemplateNonTypeParameter.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2007, 2010 QNX Software Systems and others. + * Copyright (c) 2007, 2011 QNX Software Systems and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -45,7 +45,7 @@ class PDOMCPPTemplateNonTypeParameter extends PDOMCPPBinding implements IPDOMMem protected static final int RECORD_SIZE = DEFAULTVAL + Database.PTR_SIZE; private int fCachedParamID= -1; - private IType fType; + private volatile IType fType; public PDOMCPPTemplateNonTypeParameter(PDOMLinkage linkage, PDOMNode parent, ICPPTemplateNonTypeParameter param) throws CoreException { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPTemplateTemplateParameter.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPTemplateTemplateParameter.java index 1bb6a520bf3..42fb3abf1e0 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPTemplateTemplateParameter.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPTemplateTemplateParameter.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2008, 2009 Wind River Systems, Inc. and others. + * Copyright (c) 2008, 2011 Wind River Systems, Inc. and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -60,9 +60,9 @@ public class PDOMCPPTemplateTemplateParameter extends PDOMCPPBinding @SuppressWarnings("hiding") protected static final int RECORD_SIZE = PARAMETERS + Database.PTR_SIZE; - private ICPPScope fUnknownScope; + private PDOMCPPUnknownScope fUnknownScope; // No need for volatile, PDOMCPPUnknownScope protects its fields. private int fCachedParamID= -1; - private IPDOMCPPTemplateParameter[] params; + private volatile IPDOMCPPTemplateParameter[] params; public PDOMCPPTemplateTemplateParameter(PDOMLinkage linkage, PDOMNode parent, ICPPTemplateTemplateParameter param) throws CoreException, DOMException { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPTemplateTypeParameter.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPTemplateTypeParameter.java index d028b999c58..c8c3f1ae74d 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPTemplateTypeParameter.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPTemplateTypeParameter.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2007, 2009 QNX Software Systems and others. + * Copyright (c) 2007, 2011 QNX Software Systems and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -51,7 +51,7 @@ class PDOMCPPTemplateTypeParameter extends PDOMCPPBinding implements IPDOMMember @SuppressWarnings("hiding") protected static final int RECORD_SIZE = PARAMETERID + 4; - private ICPPScope fUnknownScope; + private PDOMCPPUnknownScope fUnknownScope; // No need for volatile, PDOMCPPUnknownScope protects its fields. private int fCachedParamID= -1; public PDOMCPPTemplateTypeParameter(PDOMLinkage linkage, PDOMNode parent, ICPPTemplateTypeParameter param) diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPUnknownClassInstance.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPUnknownClassInstance.java index f0b0e49545e..c8798925839 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPUnknownClassInstance.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPUnknownClassInstance.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2008, 2010 Google, Inc and others. + * Copyright (c) 2008, 2011 Google, Inc and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -39,7 +39,7 @@ class PDOMCPPUnknownClassInstance extends PDOMCPPUnknownClassType implements ICP protected static final int RECORD_SIZE = SIGNATURE_HASH + 4; // Cached values. - ICPPTemplateArgument[] arguments; + private volatile ICPPTemplateArgument[] arguments; public PDOMCPPUnknownClassInstance(PDOMLinkage linkage, PDOMNode parent, ICPPUnknownClassInstance classInstance) throws CoreException { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPUnknownClassType.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPUnknownClassType.java index 9c27c8608aa..7733501a587 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPUnknownClassType.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPUnknownClassType.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2008, 2010 Google, Inc and others. + * Copyright (c) 2008, 2011 Google, Inc and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -53,7 +53,7 @@ class PDOMCPPUnknownClassType extends PDOMCPPUnknownBinding implements ICPPClass @SuppressWarnings("hiding") protected static final int RECORD_SIZE = PDOMCPPUnknownBinding.RECORD_SIZE + 8; - private ICPPScope unknownScope; + private PDOMCPPUnknownScope unknownScope; // No need for volatile, PDOMCPPUnknownScope protects its fields public PDOMCPPUnknownClassType(PDOMLinkage linkage, PDOMNode parent, ICPPUnknownClassType classType) throws CoreException { super(linkage, parent, classType); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPUnknownScope.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPUnknownScope.java index 6f0fbb30563..7f672db8004 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPUnknownScope.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPUnknownScope.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2008 Wind River Systems, Inc. and others. + * Copyright (c) 2008, 2011 Wind River Systems, Inc. and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -12,14 +12,12 @@ package org.eclipse.cdt.internal.core.pdom.dom.cpp; import org.eclipse.cdt.core.dom.ast.IASTName; +import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.index.IIndexName; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPUnknownScope; import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPUnknownBinding; import org.eclipse.cdt.internal.core.index.IIndexScope; -/** - * @since 5.0 - */ public class PDOMCPPUnknownScope extends CPPUnknownScope implements IIndexScope { public PDOMCPPUnknownScope(PDOMCPPBinding binding, IASTName name) { @@ -40,4 +38,10 @@ public class PDOMCPPUnknownScope extends CPPUnknownScope implements IIndexScope public PDOMCPPBinding getScopeBinding() { return (PDOMCPPBinding) super.getScopeBinding(); } + + @Override + // Needs to be thread-safe. + protected synchronized IBinding getOrCreateBinding(IASTName name, int idx) { + return super.getOrCreateBinding(name, idx); + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPUsingDeclaration.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPUsingDeclaration.java index ec2ef333467..8f3aa29586d 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPUsingDeclaration.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPUsingDeclaration.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2008, 2010 Google, Inc and others. + * Copyright (c) 2008, 2011 Google, Inc and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -43,7 +43,7 @@ class PDOMCPPUsingDeclaration extends PDOMCPPBinding implements ICPPUsingDeclara @SuppressWarnings("hiding") protected static final int RECORD_SIZE = PDOMCPPBinding.RECORD_SIZE + 8; - private IBinding[] delegates; + private volatile IBinding[] delegates; public PDOMCPPUsingDeclaration(PDOMLinkage linkage, PDOMNode parent, ICPPUsingDeclaration using) throws CoreException { -- cgit v1.2.3