1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-09-08 19:13:27 +02:00

Bug 341440: Thread safety for PDOM objects.

This commit is contained in:
Markus Schorn 2011-04-01 09:08:56 +00:00
parent 64dfda5331
commit ffd5ae3839
30 changed files with 100 additions and 79 deletions

View file

@ -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 * All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0 * are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at * which accompanies this distribution, and is available at
@ -7,6 +7,7 @@
* *
* Contributors: * Contributors:
* Devin Steffler (IBM Corporation) - initial API and implementation * Devin Steffler (IBM Corporation) - initial API and implementation
* Markus Schorn (Wind River Systems)
*******************************************************************************/ *******************************************************************************/
package org.eclipse.cdt.internal.core.dom.parser.c; 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; import org.eclipse.core.runtime.CoreException;
public class CFunctionType implements IFunctionType, ISerializableType { public class CFunctionType implements IFunctionType, ISerializableType {
IType[] parameters = null; private final IType[] parameters;
IType returnType = null; private final IType returnType;
public CFunctionType( IType returnType, IType [] types ) { public CFunctionType( IType returnType, IType [] types ) {
this.returnType = returnType; this.returnType = returnType;

View file

@ -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 * All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0 * are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at * 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 * 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 { public class AbstractCPPClassSpecializationScope implements ICPPClassSpecializationScope {
final private ICPPClassSpecialization specialClass; final private ICPPClassSpecialization specialClass;
private ICPPBase[] fBases; private volatile ICPPBase[] fBases; // Used by the pdom bindings, needs to be volatile.
public AbstractCPPClassSpecializationScope(ICPPClassSpecialization specialization) { public AbstractCPPClassSpecializationScope(ICPPClassSpecialization specialization) {
this.specialClass= specialization; this.specialClass= specialization;

View file

@ -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. * 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 { public class CPPFunctionType implements ICPPFunctionType, ISerializableType {
private IType[] parameters; private final IType[] parameters;
private IType returnType; private final IType returnType;
private boolean isConst; private final boolean isConst;
private boolean isVolatile; private final boolean isVolatile;
private boolean takesVarargs; private final boolean takesVarargs;
/**
* @param returnType
* @param types
*/
public CPPFunctionType(IType returnType, IType[] types) { public CPPFunctionType(IType returnType, IType[] types) {
this.returnType = returnType; this(returnType, types, false, false, false);
this.parameters = types;
} }
public CPPFunctionType(IType returnType, IType[] types, boolean isConst, boolean isVolatile, public CPPFunctionType(IType returnType, IType[] types, boolean isConst, boolean isVolatile,

View file

@ -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 * Models the scope represented by an unknown binding such (e.g.: template type parameter). Used within
* the context of templates, only. * 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 { public class CPPUnknownScope implements ICPPInternalUnknownScope {
private final ICPPUnknownBinding binding; private final ICPPUnknownBinding binding;
private final IASTName scopeName; 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; private CharArrayObjectMap map;
public CPPUnknownScope(ICPPUnknownBinding binding, IASTName name) { 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); map = new CharArrayObjectMap(2);
final char[] c = name.getLookupKey(); final char[] c = name.getLookupKey();
@ -141,20 +153,23 @@ public class CPPUnknownScope implements ICPPInternalUnknownScope {
map.put(c, o); map.put(c, o);
} }
int idx= type ? 0 : function ? 1 : 2;
IBinding result= o[idx]; IBinding result= o[idx];
if (result == null) { if (result == null) {
if (type) { switch (idx) {
case 0:
result= new CPPUnknownClass(binding, name.getSimpleID()); result= new CPPUnknownClass(binding, name.getSimpleID());
} else if (function) { break;
case 1:
result= new CPPUnknownFunction(binding, name.getSimpleID()); result= new CPPUnknownFunction(binding, name.getSimpleID());
} else { break;
case 2:
result= new CPPUnknownBinding(binding, name.getSimpleID()); result= new CPPUnknownBinding(binding, name.getSimpleID());
break;
} }
o[idx]= result; o[idx]= result;
} }
return result; return result;
} }
public final IBinding[] getBindings(IASTName name, boolean resolve, boolean prefix) { public final IBinding[] getBindings(IASTName name, boolean resolve, boolean prefix) {
return getBindings(name, resolve, prefix, IIndexFileSet.EMPTY); return getBindings(name, resolve, prefix, IIndexFileSet.EMPTY);

View file

@ -62,7 +62,7 @@ import org.eclipse.core.runtime.Status;
public class PDOMFile implements IIndexFragmentFile { public class PDOMFile implements IIndexFragmentFile {
private final PDOMLinkage fLinkage; private final PDOMLinkage fLinkage;
private final long record; 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_NAME = 0;
private static final int FIRST_INCLUDE = 4; private static final int FIRST_INCLUDE = 4;

View file

@ -70,7 +70,7 @@ public abstract class PDOMLinkage extends PDOMNamedNode implements IIndexLinkage
// node types // node types
protected static final int LINKAGE= 0; // special one for myself 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 PDOM fPDOM;
private final Database fDatabase; private final Database fDatabase;

View file

@ -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 * All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0 * are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at * which accompanies this distribution, and is available at
@ -38,7 +38,7 @@ public abstract class PDOMNamedNode extends PDOMNode {
@SuppressWarnings("hiding") @SuppressWarnings("hiding")
protected static final int RECORD_SIZE = PDOMNode.RECORD_SIZE + 4; protected static final int RECORD_SIZE = PDOMNode.RECORD_SIZE + 4;
private char[] fName; private volatile char[] fName;
public PDOMNamedNode(PDOMLinkage linkage, long record) { public PDOMNamedNode(PDOMLinkage linkage, long record) {
super(linkage, record); super(linkage, record);

View file

@ -32,7 +32,7 @@ public abstract class PDOMNode implements IInternalPDOMNode {
private final PDOMLinkage fLinkage; private final PDOMLinkage fLinkage;
protected final long record; protected final long record;
private long cachedParentRecord; private volatile long cachedParentRecord;
protected PDOMNode(PDOMLinkage linkage, long record) { protected PDOMNode(PDOMLinkage linkage, long record) {
fLinkage = linkage; fLinkage = linkage;

View file

@ -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 * All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0 * are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at * which accompanies this distribution, and is available at
@ -42,8 +42,8 @@ class PDOMCEnumeration extends PDOMBinding implements IEnumeration, IIndexType {
@SuppressWarnings("hiding") @SuppressWarnings("hiding")
protected static final int RECORD_SIZE = OFFSET_MAX_VALUE + 8; protected static final int RECORD_SIZE = OFFSET_MAX_VALUE + 8;
private Long fMinValue; private Long fMinValue; // No need for volatile, all fields of Long are final.
private Long fMaxValue; private Long fMaxValue; // No need for volatile, all fields of Long are final.
public PDOMCEnumeration(PDOMLinkage linkage, PDOMNode parent, IEnumeration enumeration) public PDOMCEnumeration(PDOMLinkage linkage, PDOMNode parent, IEnumeration enumeration)
throws CoreException { throws CoreException {

View file

@ -56,6 +56,7 @@ import org.eclipse.core.runtime.CoreException;
/** /**
* Represents the class scope for a class stored in the index. * 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 { class PDOMCPPClassScope implements ICPPClassScope, IIndexScope {
private static final class PopulateMap implements IPDOMVisitor { 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) { public PDOMCPPClassScope(IPDOMCPPClassType binding) {
fBinding= binding; fBinding= binding;

View file

@ -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 * All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0 * are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at * which accompanies this distribution, and is available at
@ -59,8 +59,9 @@ class PDOMCPPClassSpecialization extends PDOMCPPSpecialization implements
*/ */
@SuppressWarnings("hiding") @SuppressWarnings("hiding")
protected static final int RECORD_SIZE = PDOMCPPSpecialization.RECORD_SIZE + 8; 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) public PDOMCPPClassSpecialization(PDOMLinkage linkage, PDOMNode parent, ICPPClassType classType, PDOMBinding specialized)
throws CoreException { throws CoreException {

View file

@ -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 * All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0 * are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at * which accompanies this distribution, and is available at
@ -59,7 +59,7 @@ public class PDOMCPPClassTemplate extends PDOMCPPClassType
@SuppressWarnings("hiding") @SuppressWarnings("hiding")
protected static final int RECORD_SIZE = PDOMCPPClassType.RECORD_SIZE + 10; 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 { public PDOMCPPClassTemplate(PDOMCPPLinkage linkage, PDOMNode parent, ICPPClassTemplate template) throws CoreException, DOMException {
super(linkage, parent, template); super(linkage, parent, template);

View file

@ -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 * All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0 * are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at * which accompanies this distribution, and is available at
@ -39,7 +39,7 @@ class PDOMCPPClassTemplatePartialSpecializationSpecialization extends PDOMCPPCla
@SuppressWarnings("hiding") @SuppressWarnings("hiding")
protected static final int RECORD_SIZE= PDOMCPPClassTemplateSpecialization.RECORD_SIZE+12; protected static final int RECORD_SIZE= PDOMCPPClassTemplateSpecialization.RECORD_SIZE+12;
private ICPPClassTemplate fPrimaryTemplate; private volatile ICPPClassTemplate fPrimaryTemplate;
public PDOMCPPClassTemplatePartialSpecializationSpecialization(PDOMCPPLinkage linkage, public PDOMCPPClassTemplatePartialSpecializationSpecialization(PDOMCPPLinkage linkage,
PDOMNode parent, PDOMBinding specialized, ICPPClassTemplatePartialSpecialization partial, PDOMNode parent, PDOMBinding specialized, ICPPClassTemplatePartialSpecialization partial,

View file

@ -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 * All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0 * are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at * which accompanies this distribution, and is available at
@ -61,7 +61,7 @@ class PDOMCPPClassType extends PDOMCPPBinding implements IPDOMCPPClassType, IPDO
@SuppressWarnings("hiding") @SuppressWarnings("hiding")
protected static final int RECORD_SIZE = PDOMCPPBinding.RECORD_SIZE + 14; 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 { public PDOMCPPClassType(PDOMLinkage linkage, PDOMNode parent, ICPPClassType classType) throws CoreException {
super(linkage, parent, classType.getNameCharArray()); super(linkage, parent, classType.getNameCharArray());

View file

@ -56,7 +56,7 @@ class PDOMCPPDeferredClassInstance extends PDOMCPPSpecialization
@SuppressWarnings("hiding") @SuppressWarnings("hiding")
protected static final int RECORD_SIZE = PDOMCPPSpecialization.RECORD_SIZE + 8; 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, public PDOMCPPDeferredClassInstance(PDOMLinkage linkage, PDOMNode parent,
ICPPDeferredClassInstance classType, PDOMBinding instantiated) throws CoreException { ICPPDeferredClassInstance classType, PDOMBinding instantiated) throws CoreException {

View file

@ -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 * All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0 * are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at * 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. * 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 { class PDOMCPPEnumScope implements ICPPScope, IIndexScope {
private IPDOMCPPEnumType fBinding; private final IPDOMCPPEnumType fBinding;
public PDOMCPPEnumScope(IPDOMCPPEnumType binding) { public PDOMCPPEnumScope(IPDOMCPPEnumType binding) {
fBinding= binding; fBinding= binding;

View file

@ -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 * All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0 * are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at * which accompanies this distribution, and is available at
@ -51,10 +51,10 @@ class PDOMCPPEnumeration extends PDOMCPPBinding implements IPDOMCPPEnumType, IPD
@SuppressWarnings("hiding") @SuppressWarnings("hiding")
protected static final int RECORD_SIZE = OFFSET_FLAGS + 1; protected static final int RECORD_SIZE = OFFSET_FLAGS + 1;
private Long fMinValue; private Long fMinValue; // No need for volatile, all fields of Long are final.
private Long fMaxValue; private Long fMaxValue; // No need for volatile, all fields of Long are final.
private IType fFixedType= ProblemBinding.NOT_INITIALIZED; private volatile IType fFixedType= ProblemBinding.NOT_INITIALIZED;
private PDOMCPPEnumScope fScope; private PDOMCPPEnumScope fScope; // No need for volatile, all fields of PDOMCPPEnumScope are final.
public PDOMCPPEnumeration(PDOMLinkage linkage, PDOMNode parent, ICPPEnumeration enumeration) public PDOMCPPEnumeration(PDOMLinkage linkage, PDOMNode parent, ICPPEnumeration enumeration)
throws CoreException { throws CoreException {

View file

@ -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 * All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0 * are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at * which accompanies this distribution, and is available at
@ -85,7 +85,7 @@ class PDOMCPPFunction extends PDOMCPPBinding implements ICPPFunction, IPDOMOverl
private short fAnnotation= -1; private short fAnnotation= -1;
private int fRequiredArgCount= -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 { public PDOMCPPFunction(PDOMLinkage linkage, PDOMNode parent, ICPPFunction function, boolean setTypes) throws CoreException, DOMException {
super(linkage, parent, function.getNameCharArray()); super(linkage, parent, function.getNameCharArray());

View file

@ -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 * All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0 * are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at * 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_PARAMETER_PACK = 8;
private static final short ANNOT_IS_DELETED = 9; 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 short fAnnotation= -1;
private int fRequiredArgCount= -1; private int fRequiredArgCount= -1;
public PDOMCPPFunctionSpecialization(PDOMLinkage linkage, PDOMNode parent, ICPPFunction astFunction, PDOMBinding specialized) throws CoreException { public PDOMCPPFunctionSpecialization(PDOMLinkage linkage, PDOMNode parent, ICPPFunction astFunction, PDOMBinding specialized) throws CoreException {

View file

@ -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 * All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0 * are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at * which accompanies this distribution, and is available at
@ -41,7 +41,7 @@ class PDOMCPPFunctionTemplate extends PDOMCPPFunction
@SuppressWarnings("hiding") @SuppressWarnings("hiding")
protected static final int RECORD_SIZE = TEMPLATE_PARAMS + Database.PTR_SIZE; 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) public PDOMCPPFunctionTemplate(PDOMCPPLinkage linkage, PDOMNode parent, ICPPFunctionTemplate template)
throws CoreException, DOMException { throws CoreException, DOMException {

View file

@ -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 * All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0 * are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at * which accompanies this distribution, and is available at
@ -114,7 +114,8 @@ class PDOMCPPLinkage extends PDOMLinkage implements IIndexCPPBindingConstants {
@SuppressWarnings("hiding") @SuppressWarnings("hiding")
private final static int RECORD_SIZE= FIRST_NAMESPACE_CHILD_OFFSET + Database.PTR_SIZE; private final static int RECORD_SIZE= FIRST_NAMESPACE_CHILD_OFFSET + Database.PTR_SIZE;
private LinkedList<Runnable> postProcesses = new LinkedList<Runnable>(); // Only used when writing to database, which is single-threaded
private LinkedList<Runnable> postProcesses = new LinkedList<Runnable>();
public PDOMCPPLinkage(PDOM pdom, long record) { public PDOMCPPLinkage(PDOM pdom, long record) {
super(pdom, record); super(pdom, record);

View file

@ -62,7 +62,7 @@ class PDOMCPPNamespace extends PDOMCPPBinding
private static int INLINE_FLAG= 0x1; private static int INLINE_FLAG= 0x1;
private int fFlag= -1; private int fFlag= -1;
private ICPPNamespaceScope[] fInlineNamespaces; private volatile ICPPNamespaceScope[] fInlineNamespaces;
public PDOMCPPNamespace(PDOMLinkage linkage, PDOMNode parent, ICPPNamespace namespace) throws CoreException { public PDOMCPPNamespace(PDOMLinkage linkage, PDOMNode parent, ICPPNamespace namespace) throws CoreException {
super(linkage, parent, namespace.getNameCharArray()); super(linkage, parent, namespace.getNameCharArray());

View file

@ -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 * All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0 * are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at * 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. * Base class for specializations and instances of other bindings.
*/ */
abstract class PDOMCPPSpecialization extends PDOMCPPBinding implements ICPPSpecialization, IPDOMOverloader { abstract class PDOMCPPSpecialization extends PDOMCPPBinding implements ICPPSpecialization, IPDOMOverloader {
private static final int ARGMAP = PDOMCPPBinding.RECORD_SIZE + 0; private static final int ARGMAP = PDOMCPPBinding.RECORD_SIZE + 0;
private static final int SIGNATURE_HASH = PDOMCPPBinding.RECORD_SIZE + 4; private static final int SIGNATURE_HASH = PDOMCPPBinding.RECORD_SIZE + 4;
private static final int SPECIALIZED = PDOMCPPBinding.RECORD_SIZE + 8; private static final int SPECIALIZED = PDOMCPPBinding.RECORD_SIZE + 8;
@ -40,8 +41,8 @@ abstract class PDOMCPPSpecialization extends PDOMCPPBinding implements ICPPSpeci
@SuppressWarnings("hiding") @SuppressWarnings("hiding")
protected static final int RECORD_SIZE = PDOMCPPBinding.RECORD_SIZE + 12; protected static final int RECORD_SIZE = PDOMCPPBinding.RECORD_SIZE + 12;
private IBinding fSpecializedCache= null; private volatile IBinding fSpecializedCache= null;
private ICPPTemplateParameterMap fArgMap; private volatile ICPPTemplateParameterMap fArgMap;
public PDOMCPPSpecialization(PDOMLinkage linkage, PDOMNode parent, ICPPSpecialization spec, public PDOMCPPSpecialization(PDOMLinkage linkage, PDOMNode parent, ICPPSpecialization spec,
IPDOMBinding specialized) throws CoreException { IPDOMBinding specialized) throws CoreException {

View file

@ -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 * All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0 * are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at * 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; protected static final int RECORD_SIZE = DEFAULTVAL + Database.PTR_SIZE;
private int fCachedParamID= -1; private int fCachedParamID= -1;
private IType fType; private volatile IType fType;
public PDOMCPPTemplateNonTypeParameter(PDOMLinkage linkage, PDOMNode parent, public PDOMCPPTemplateNonTypeParameter(PDOMLinkage linkage, PDOMNode parent,
ICPPTemplateNonTypeParameter param) throws CoreException { ICPPTemplateNonTypeParameter param) throws CoreException {

View file

@ -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 * All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0 * are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at * which accompanies this distribution, and is available at
@ -60,9 +60,9 @@ public class PDOMCPPTemplateTemplateParameter extends PDOMCPPBinding
@SuppressWarnings("hiding") @SuppressWarnings("hiding")
protected static final int RECORD_SIZE = PARAMETERS + Database.PTR_SIZE; 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 int fCachedParamID= -1;
private IPDOMCPPTemplateParameter[] params; private volatile IPDOMCPPTemplateParameter[] params;
public PDOMCPPTemplateTemplateParameter(PDOMLinkage linkage, PDOMNode parent, ICPPTemplateTemplateParameter param) public PDOMCPPTemplateTemplateParameter(PDOMLinkage linkage, PDOMNode parent, ICPPTemplateTemplateParameter param)
throws CoreException, DOMException { throws CoreException, DOMException {

View file

@ -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 * All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0 * are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at * which accompanies this distribution, and is available at
@ -51,7 +51,7 @@ class PDOMCPPTemplateTypeParameter extends PDOMCPPBinding implements IPDOMMember
@SuppressWarnings("hiding") @SuppressWarnings("hiding")
protected static final int RECORD_SIZE = PARAMETERID + 4; 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; private int fCachedParamID= -1;
public PDOMCPPTemplateTypeParameter(PDOMLinkage linkage, PDOMNode parent, ICPPTemplateTypeParameter param) public PDOMCPPTemplateTypeParameter(PDOMLinkage linkage, PDOMNode parent, ICPPTemplateTypeParameter param)

View file

@ -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 * All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0 * are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at * 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; protected static final int RECORD_SIZE = SIGNATURE_HASH + 4;
// Cached values. // Cached values.
ICPPTemplateArgument[] arguments; private volatile ICPPTemplateArgument[] arguments;
public PDOMCPPUnknownClassInstance(PDOMLinkage linkage, PDOMNode parent, ICPPUnknownClassInstance classInstance) public PDOMCPPUnknownClassInstance(PDOMLinkage linkage, PDOMNode parent, ICPPUnknownClassInstance classInstance)
throws CoreException { throws CoreException {

View file

@ -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 * All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0 * are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at * which accompanies this distribution, and is available at
@ -53,7 +53,7 @@ class PDOMCPPUnknownClassType extends PDOMCPPUnknownBinding implements ICPPClass
@SuppressWarnings("hiding") @SuppressWarnings("hiding")
protected static final int RECORD_SIZE = PDOMCPPUnknownBinding.RECORD_SIZE + 8; 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 { public PDOMCPPUnknownClassType(PDOMLinkage linkage, PDOMNode parent, ICPPUnknownClassType classType) throws CoreException {
super(linkage, parent, classType); super(linkage, parent, classType);

View file

@ -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 * All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0 * are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at * which accompanies this distribution, and is available at
@ -12,14 +12,12 @@
package org.eclipse.cdt.internal.core.pdom.dom.cpp; package org.eclipse.cdt.internal.core.pdom.dom.cpp;
import org.eclipse.cdt.core.dom.ast.IASTName; 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.core.index.IIndexName;
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPUnknownScope; 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.dom.parser.cpp.ICPPUnknownBinding;
import org.eclipse.cdt.internal.core.index.IIndexScope; import org.eclipse.cdt.internal.core.index.IIndexScope;
/**
* @since 5.0
*/
public class PDOMCPPUnknownScope extends CPPUnknownScope implements IIndexScope { public class PDOMCPPUnknownScope extends CPPUnknownScope implements IIndexScope {
public PDOMCPPUnknownScope(PDOMCPPBinding binding, IASTName name) { public PDOMCPPUnknownScope(PDOMCPPBinding binding, IASTName name) {
@ -40,4 +38,10 @@ public class PDOMCPPUnknownScope extends CPPUnknownScope implements IIndexScope
public PDOMCPPBinding getScopeBinding() { public PDOMCPPBinding getScopeBinding() {
return (PDOMCPPBinding) super.getScopeBinding(); return (PDOMCPPBinding) super.getScopeBinding();
} }
@Override
// Needs to be thread-safe.
protected synchronized IBinding getOrCreateBinding(IASTName name, int idx) {
return super.getOrCreateBinding(name, idx);
}
} }

View file

@ -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 * All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0 * are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at * which accompanies this distribution, and is available at
@ -43,7 +43,7 @@ class PDOMCPPUsingDeclaration extends PDOMCPPBinding implements ICPPUsingDeclara
@SuppressWarnings("hiding") @SuppressWarnings("hiding")
protected static final int RECORD_SIZE = PDOMCPPBinding.RECORD_SIZE + 8; 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) public PDOMCPPUsingDeclaration(PDOMLinkage linkage, PDOMNode parent, ICPPUsingDeclaration using)
throws CoreException { throws CoreException {