Browse Source

Replace LazyInit.ReadBarrier() with LazyInit.VolatileRead().

newNRvisualizers
Daniel Grunwald 14 years ago
parent
commit
e213758ec7
  1. 75
      ICSharpCode.NRefactory.CSharp/Resolver/CSharpOperators.cs
  2. 3
      ICSharpCode.NRefactory.CSharp/Resolver/CSharpResolver.cs
  3. 9
      ICSharpCode.NRefactory.CSharp/TypeSystem/CSharpAssembly.cs
  4. 9
      ICSharpCode.NRefactory.CSharp/TypeSystem/CSharpAttribute.cs
  5. 9
      ICSharpCode.NRefactory.CSharp/TypeSystem/ResolvedUsingScope.cs
  6. 3
      ICSharpCode.NRefactory.Xml/AXmlObject.cs
  7. 6
      ICSharpCode.NRefactory/TypeSystem/CecilLoader.cs
  8. 6
      ICSharpCode.NRefactory/TypeSystem/Implementation/AbstractResolvedMember.cs
  9. 18
      ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultResolvedTypeDefinition.cs
  10. 3
      ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultUnresolvedAssembly.cs
  11. 3
      ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultUnresolvedAttribute.cs
  12. 3
      ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultUnresolvedParameter.cs
  13. 3
      ICSharpCode.NRefactory/TypeSystem/Implementation/KnownTypeCache.cs
  14. 3
      ICSharpCode.NRefactory/TypeSystem/Implementation/MergedNamespace.cs
  15. 3
      ICSharpCode.NRefactory/TypeSystem/Implementation/SimpleCompilation.cs
  16. 14
      ICSharpCode.NRefactory/Utils/LazyInit.cs
  17. 6
      ICSharpCode.NRefactory/Utils/ProjectedList.cs

75
ICSharpCode.NRefactory.CSharp/Resolver/CSharpOperators.cs

@ -327,9 +327,8 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver @@ -327,9 +327,8 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
public OperatorMethod[] UnaryPlusOperators {
get {
OperatorMethod[] ops = unaryPlusOperators;
OperatorMethod[] ops = LazyInit.VolatileRead(ref unaryPlusOperators);
if (ops != null) {
LazyInit.ReadBarrier();
return ops;
} else {
return LazyInit.GetOrSet(ref unaryPlusOperators, Lift(
@ -350,9 +349,8 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver @@ -350,9 +349,8 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
public OperatorMethod[] UncheckedUnaryMinusOperators {
get {
OperatorMethod[] ops = uncheckedUnaryMinusOperators;
OperatorMethod[] ops = LazyInit.VolatileRead(ref uncheckedUnaryMinusOperators);
if (ops != null) {
LazyInit.ReadBarrier();
return ops;
} else {
return LazyInit.GetOrSet(ref uncheckedUnaryMinusOperators, Lift(
@ -370,9 +368,8 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver @@ -370,9 +368,8 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
public OperatorMethod[] CheckedUnaryMinusOperators {
get {
OperatorMethod[] ops = checkedUnaryMinusOperators;
OperatorMethod[] ops = LazyInit.VolatileRead(ref checkedUnaryMinusOperators);
if (ops != null) {
LazyInit.ReadBarrier();
return ops;
} else {
return LazyInit.GetOrSet(ref checkedUnaryMinusOperators, Lift(
@ -391,9 +388,8 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver @@ -391,9 +388,8 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
public OperatorMethod[] LogicalNegationOperators {
get {
OperatorMethod[] ops = logicalNegationOperators;
OperatorMethod[] ops = LazyInit.VolatileRead(ref logicalNegationOperators);
if (ops != null) {
LazyInit.ReadBarrier();
return ops;
} else {
return LazyInit.GetOrSet(ref logicalNegationOperators, Lift(
@ -408,9 +404,8 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver @@ -408,9 +404,8 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
public OperatorMethod[] BitwiseComplementOperators {
get {
OperatorMethod[] ops = bitwiseComplementOperators;
OperatorMethod[] ops = LazyInit.VolatileRead(ref bitwiseComplementOperators);
if (ops != null) {
LazyInit.ReadBarrier();
return ops;
} else {
return LazyInit.GetOrSet(ref bitwiseComplementOperators, Lift(
@ -501,9 +496,8 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver @@ -501,9 +496,8 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
public OperatorMethod[] MultiplicationOperators {
get {
OperatorMethod[] ops = multiplicationOperators;
OperatorMethod[] ops = LazyInit.VolatileRead(ref multiplicationOperators);
if (ops != null) {
LazyInit.ReadBarrier();
return ops;
} else {
return LazyInit.GetOrSet(ref multiplicationOperators, Lift(
@ -524,9 +518,8 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver @@ -524,9 +518,8 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
public OperatorMethod[] DivisionOperators {
get {
OperatorMethod[] ops = divisionOperators;
OperatorMethod[] ops = LazyInit.VolatileRead(ref divisionOperators);
if (ops != null) {
LazyInit.ReadBarrier();
return ops;
} else {
return LazyInit.GetOrSet(ref divisionOperators, Lift(
@ -547,9 +540,8 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver @@ -547,9 +540,8 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
public OperatorMethod[] RemainderOperators {
get {
OperatorMethod[] ops = remainderOperators;
OperatorMethod[] ops = LazyInit.VolatileRead(ref remainderOperators);
if (ops != null) {
LazyInit.ReadBarrier();
return ops;
} else {
return LazyInit.GetOrSet(ref remainderOperators, Lift(
@ -570,9 +562,8 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver @@ -570,9 +562,8 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
public OperatorMethod[] AdditionOperators {
get {
OperatorMethod[] ops = additionOperators;
OperatorMethod[] ops = LazyInit.VolatileRead(ref additionOperators);
if (ops != null) {
LazyInit.ReadBarrier();
return ops;
} else {
return LazyInit.GetOrSet(ref additionOperators, Lift(
@ -620,9 +611,8 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver @@ -620,9 +611,8 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
public OperatorMethod[] SubtractionOperators {
get {
OperatorMethod[] ops = subtractionOperators;
OperatorMethod[] ops = LazyInit.VolatileRead(ref subtractionOperators);
if (ops != null) {
LazyInit.ReadBarrier();
return ops;
} else {
return LazyInit.GetOrSet(ref subtractionOperators, Lift(
@ -643,9 +633,8 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver @@ -643,9 +633,8 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
public OperatorMethod[] ShiftLeftOperators {
get {
OperatorMethod[] ops = shiftLeftOperators;
OperatorMethod[] ops = LazyInit.VolatileRead(ref shiftLeftOperators);
if (ops != null) {
LazyInit.ReadBarrier();
return ops;
} else {
return LazyInit.GetOrSet(ref shiftLeftOperators, Lift(
@ -662,9 +651,8 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver @@ -662,9 +651,8 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
public OperatorMethod[] ShiftRightOperators {
get {
OperatorMethod[] ops = shiftRightOperators;
OperatorMethod[] ops = LazyInit.VolatileRead(ref shiftRightOperators);
if (ops != null) {
LazyInit.ReadBarrier();
return ops;
} else {
return LazyInit.GetOrSet(ref shiftRightOperators, Lift(
@ -767,9 +755,8 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver @@ -767,9 +755,8 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
public OperatorMethod[] ValueEqualityOperators {
get {
OperatorMethod[] ops = valueEqualityOperators;
OperatorMethod[] ops = LazyInit.VolatileRead(ref valueEqualityOperators);
if (ops != null) {
LazyInit.ReadBarrier();
return ops;
} else {
return LazyInit.GetOrSet(ref valueEqualityOperators, Lift(
@ -783,9 +770,8 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver @@ -783,9 +770,8 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
public OperatorMethod[] ValueInequalityOperators {
get {
OperatorMethod[] ops = valueInequalityOperators;
OperatorMethod[] ops = LazyInit.VolatileRead(ref valueInequalityOperators);
if (ops != null) {
LazyInit.ReadBarrier();
return ops;
} else {
return LazyInit.GetOrSet(ref valueInequalityOperators, Lift(
@ -799,9 +785,8 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver @@ -799,9 +785,8 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
public OperatorMethod[] ReferenceEqualityOperators {
get {
OperatorMethod[] ops = referenceEqualityOperators;
OperatorMethod[] ops = LazyInit.VolatileRead(ref referenceEqualityOperators);
if (ops != null) {
LazyInit.ReadBarrier();
return ops;
} else {
return LazyInit.GetOrSet(ref referenceEqualityOperators, Lift(
@ -816,9 +801,8 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver @@ -816,9 +801,8 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
public OperatorMethod[] ReferenceInequalityOperators {
get {
OperatorMethod[] ops = referenceInequalityOperators;
OperatorMethod[] ops = LazyInit.VolatileRead(ref referenceInequalityOperators);
if (ops != null) {
LazyInit.ReadBarrier();
return ops;
} else {
return LazyInit.GetOrSet(ref referenceInequalityOperators, Lift(
@ -868,9 +852,8 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver @@ -868,9 +852,8 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
public OperatorMethod[] LessThanOperators {
get {
OperatorMethod[] ops = lessThanOperators;
OperatorMethod[] ops = LazyInit.VolatileRead(ref lessThanOperators);
if (ops != null) {
LazyInit.ReadBarrier();
return ops;
} else {
return LazyInit.GetOrSet(ref lessThanOperators, Lift(
@ -890,9 +873,8 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver @@ -890,9 +873,8 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
public OperatorMethod[] LessThanOrEqualOperators {
get {
OperatorMethod[] ops = lessThanOrEqualOperators;
OperatorMethod[] ops = LazyInit.VolatileRead(ref lessThanOrEqualOperators);
if (ops != null) {
LazyInit.ReadBarrier();
return ops;
} else {
return LazyInit.GetOrSet(ref lessThanOrEqualOperators, Lift(
@ -912,9 +894,8 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver @@ -912,9 +894,8 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
public OperatorMethod[] GreaterThanOperators {
get {
OperatorMethod[] ops = greaterThanOperators;
OperatorMethod[] ops = LazyInit.VolatileRead(ref greaterThanOperators);
if (ops != null) {
LazyInit.ReadBarrier();
return ops;
} else {
return LazyInit.GetOrSet(ref greaterThanOperators, Lift(
@ -934,9 +915,8 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver @@ -934,9 +915,8 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
public OperatorMethod[] GreaterThanOrEqualOperators {
get {
OperatorMethod[] ops = greaterThanOrEqualOperators;
OperatorMethod[] ops = LazyInit.VolatileRead(ref greaterThanOrEqualOperators);
if (ops != null) {
LazyInit.ReadBarrier();
return ops;
} else {
return LazyInit.GetOrSet(ref greaterThanOrEqualOperators, Lift(
@ -958,9 +938,8 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver @@ -958,9 +938,8 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
public OperatorMethod[] LogicalAndOperators {
get {
OperatorMethod[] ops = logicalAndOperators;
OperatorMethod[] ops = LazyInit.VolatileRead(ref logicalAndOperators);
if (ops != null) {
LazyInit.ReadBarrier();
return ops;
} else {
return LazyInit.GetOrSet(ref logicalAndOperators, new OperatorMethod[] {
@ -975,9 +954,8 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver @@ -975,9 +954,8 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
public OperatorMethod[] BitwiseAndOperators {
get {
OperatorMethod[] ops = bitwiseAndOperators;
OperatorMethod[] ops = LazyInit.VolatileRead(ref bitwiseAndOperators);
if (ops != null) {
LazyInit.ReadBarrier();
return ops;
} else {
return LazyInit.GetOrSet(ref bitwiseAndOperators, Lift(
@ -996,9 +974,8 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver @@ -996,9 +974,8 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
public OperatorMethod[] LogicalOrOperators {
get {
OperatorMethod[] ops = logicalOrOperators;
OperatorMethod[] ops = LazyInit.VolatileRead(ref logicalOrOperators);
if (ops != null) {
LazyInit.ReadBarrier();
return ops;
} else {
return LazyInit.GetOrSet(ref logicalOrOperators, new OperatorMethod[] {
@ -1012,9 +989,8 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver @@ -1012,9 +989,8 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
public OperatorMethod[] BitwiseOrOperators {
get {
OperatorMethod[] ops = bitwiseOrOperators;
OperatorMethod[] ops = LazyInit.VolatileRead(ref bitwiseOrOperators);
if (ops != null) {
LazyInit.ReadBarrier();
return ops;
} else {
return LazyInit.GetOrSet(ref bitwiseOrOperators, Lift(
@ -1036,9 +1012,8 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver @@ -1036,9 +1012,8 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
public OperatorMethod[] BitwiseXorOperators {
get {
OperatorMethod[] ops = bitwiseXorOperators;
OperatorMethod[] ops = LazyInit.VolatileRead(ref bitwiseXorOperators);
if (ops != null) {
LazyInit.ReadBarrier();
return ops;
} else {
return LazyInit.GetOrSet(ref bitwiseXorOperators, Lift(

3
ICSharpCode.NRefactory.CSharp/Resolver/CSharpResolver.cs

@ -1794,9 +1794,8 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver @@ -1794,9 +1794,8 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
var currentUsingScope = context.CurrentUsingScope;
if (currentUsingScope == null)
return EmptyList<List<IMethod>>.Instance;
List<List<IMethod>> extensionMethodGroups = currentUsingScope.AllExtensionMethods;
List<List<IMethod>> extensionMethodGroups = LazyInit.VolatileRead(ref currentUsingScope.AllExtensionMethods);
if (extensionMethodGroups != null) {
LazyInit.ReadBarrier();
return extensionMethodGroups;
}
extensionMethodGroups = new List<List<IMethod>>();

9
ICSharpCode.NRefactory.CSharp/TypeSystem/CSharpAssembly.cs

@ -68,9 +68,8 @@ namespace ICSharpCode.NRefactory.CSharp.TypeSystem @@ -68,9 +68,8 @@ namespace ICSharpCode.NRefactory.CSharp.TypeSystem
IList<IAttribute> GetAttributes(ref IList<IAttribute> field, bool assemblyAttributes)
{
IList<IAttribute> result = field;
IList<IAttribute> result = LazyInit.VolatileRead(ref field);
if (result != null) {
LazyInit.ReadBarrier();
return result;
} else {
result = new List<IAttribute>();
@ -89,9 +88,8 @@ namespace ICSharpCode.NRefactory.CSharp.TypeSystem @@ -89,9 +88,8 @@ namespace ICSharpCode.NRefactory.CSharp.TypeSystem
public INamespace RootNamespace {
get {
NS root = this.rootNamespace;
NS root = LazyInit.VolatileRead(ref this.rootNamespace);
if (root != null) {
LazyInit.ReadBarrier();
return root;
} else {
root = new NS(this);
@ -183,9 +181,8 @@ namespace ICSharpCode.NRefactory.CSharp.TypeSystem @@ -183,9 +181,8 @@ namespace ICSharpCode.NRefactory.CSharp.TypeSystem
Dictionary<FullNameAndTypeParameterCount, ITypeDefinition> GetTypes()
{
var dict = this.typeDict;
var dict = LazyInit.VolatileRead(ref this.typeDict);
if (dict != null) {
LazyInit.ReadBarrier();
return dict;
} else {
// Always use the ordinal comparer for the main dictionary so that partial classes

9
ICSharpCode.NRefactory.CSharp/TypeSystem/CSharpAttribute.cs

@ -93,9 +93,8 @@ namespace ICSharpCode.NRefactory.CSharp.TypeSystem @@ -93,9 +93,8 @@ namespace ICSharpCode.NRefactory.CSharp.TypeSystem
InvocationResolveResult GetCtorInvocation()
{
ResolveResult rr = this.ctorInvocation;
ResolveResult rr = LazyInit.VolatileRead(ref this.ctorInvocation);
if (rr != null) {
LazyInit.ReadBarrier();
return rr as InvocationResolveResult;
} else {
CSharpResolver resolver = new CSharpResolver(context);
@ -132,9 +131,8 @@ namespace ICSharpCode.NRefactory.CSharp.TypeSystem @@ -132,9 +131,8 @@ namespace ICSharpCode.NRefactory.CSharp.TypeSystem
IList<ResolveResult> IAttribute.PositionalArguments {
get {
var result = this.positionalArguments;
var result = LazyInit.VolatileRead(ref this.positionalArguments);
if (result != null) {
LazyInit.ReadBarrier();
return result;
} else {
var invocation = GetCtorInvocation();
@ -149,9 +147,8 @@ namespace ICSharpCode.NRefactory.CSharp.TypeSystem @@ -149,9 +147,8 @@ namespace ICSharpCode.NRefactory.CSharp.TypeSystem
IList<KeyValuePair<IMember, ResolveResult>> IAttribute.NamedArguments {
get {
var namedArgs = this.namedArguments;
var namedArgs = LazyInit.VolatileRead(ref this.namedArguments);
if (namedArgs != null) {
LazyInit.ReadBarrier();
return namedArgs;
} else {
namedArgs = new List<KeyValuePair<IMember, ResolveResult>>();

9
ICSharpCode.NRefactory.CSharp/TypeSystem/ResolvedUsingScope.cs

@ -64,9 +64,8 @@ namespace ICSharpCode.NRefactory.CSharp.TypeSystem @@ -64,9 +64,8 @@ namespace ICSharpCode.NRefactory.CSharp.TypeSystem
public INamespace Namespace {
get {
INamespace result = this.@namespace;
INamespace result = LazyInit.VolatileRead(ref this.@namespace);
if (result != null) {
LazyInit.ReadBarrier();
return result;
} else {
if (parentContext.CurrentUsingScope != null) {
@ -90,9 +89,8 @@ namespace ICSharpCode.NRefactory.CSharp.TypeSystem @@ -90,9 +89,8 @@ namespace ICSharpCode.NRefactory.CSharp.TypeSystem
public IList<INamespace> Usings {
get {
var result = this.usings;
var result = LazyInit.VolatileRead(ref this.usings);
if (result != null) {
LazyInit.ReadBarrier();
return result;
} else {
result = new List<INamespace>();
@ -111,9 +109,8 @@ namespace ICSharpCode.NRefactory.CSharp.TypeSystem @@ -111,9 +109,8 @@ namespace ICSharpCode.NRefactory.CSharp.TypeSystem
public IList<KeyValuePair<string, ResolveResult>> UsingAliases {
get {
var result = this.usingAliases;
var result = LazyInit.VolatileRead(ref this.usingAliases);
if (result != null) {
LazyInit.ReadBarrier();
return result;
} else {
CSharpResolver resolver = new CSharpResolver(parentContext.WithUsingScope(this));

3
ICSharpCode.NRefactory.Xml/AXmlObject.cs

@ -79,9 +79,8 @@ namespace ICSharpCode.NRefactory.Xml @@ -79,9 +79,8 @@ namespace ICSharpCode.NRefactory.Xml
/// </summary>
public IList<AXmlObject> Children {
get {
var result = this.children;
var result = LazyInit.VolatileRead(ref this.children);
if (result != null) {
LazyInit.ReadBarrier();
return result;
} else {
if (internalObject.NestedObjects != null) {

6
ICSharpCode.NRefactory/TypeSystem/CecilLoader.cs

@ -869,9 +869,8 @@ namespace ICSharpCode.NRefactory.TypeSystem @@ -869,9 +869,8 @@ namespace ICSharpCode.NRefactory.TypeSystem
public IList<ResolveResult> PositionalArguments {
get {
var result = this.positionalArguments;
var result = LazyInit.VolatileRead(ref this.positionalArguments);
if (result != null) {
LazyInit.ReadBarrier();
return result;
}
DecodeBlob();
@ -881,9 +880,8 @@ namespace ICSharpCode.NRefactory.TypeSystem @@ -881,9 +880,8 @@ namespace ICSharpCode.NRefactory.TypeSystem
public IList<KeyValuePair<IMember, ResolveResult>> NamedArguments {
get {
var result = this.namedArguments;
var result = LazyInit.VolatileRead(ref this.namedArguments);
if (result != null) {
LazyInit.ReadBarrier();
return result;
}
DecodeBlob();

6
ICSharpCode.NRefactory/TypeSystem/Implementation/AbstractResolvedMember.cs

@ -56,9 +56,8 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation @@ -56,9 +56,8 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation
public IList<IMember> ImplementedInterfaceMembers {
get {
IList<IMember> result = this.implementedInterfaceMembers;
IList<IMember> result = LazyInit.VolatileRead(ref this.implementedInterfaceMembers);
if (result != null) {
LazyInit.ReadBarrier();
return result;
} else {
return LazyInit.GetOrSet(ref implementedInterfaceMembers, FindImplementedInterfaceMembers());
@ -123,9 +122,8 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation @@ -123,9 +122,8 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation
{
if (unresolvedAccessor == null)
return null;
IMethod result = accessorField;
IMethod result = LazyInit.VolatileRead(ref accessorField);
if (result != null) {
LazyInit.ReadBarrier();
return result;
} else {
return LazyInit.GetOrSet(ref accessorField, (IMethod)unresolvedAccessor.CreateResolved(context));

18
ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultResolvedTypeDefinition.cs

@ -61,9 +61,8 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation @@ -61,9 +61,8 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation
public IList<ITypeParameter> TypeParameters {
get {
var result = this.typeParameters;
var result = LazyInit.VolatileRead(ref this.typeParameters);
if (result != null) {
LazyInit.ReadBarrier();
return result;
}
ITypeResolveContext contextForTypeParameters = parts[0].CreateResolveContext(parentContext);
@ -91,9 +90,8 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation @@ -91,9 +90,8 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation
public IList<IAttribute> Attributes {
get {
var result = this.attributes;
var result = LazyInit.VolatileRead(ref this.attributes);
if (result != null) {
LazyInit.ReadBarrier();
return result;
}
result = new List<IAttribute>();
@ -126,9 +124,8 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation @@ -126,9 +124,8 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation
public IList<ITypeDefinition> NestedTypes {
get {
IList<ITypeDefinition> result = this.nestedTypes;
IList<ITypeDefinition> result = LazyInit.VolatileRead(ref this.nestedTypes);
if (result != null) {
LazyInit.ReadBarrier();
return result;
} else {
result = (
@ -171,9 +168,8 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation @@ -171,9 +168,8 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation
public IMember this[int index] {
get {
IMember output = resolvedMembers[index];
IMember output = LazyInit.VolatileRead(ref resolvedMembers[index]);
if (output != null) {
LazyInit.ReadBarrier();
return output;
}
return LazyInit.GetOrSet(ref resolvedMembers[index], unresolvedMembers[index].CreateResolved(contextPerMember[index]));
@ -288,9 +284,8 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation @@ -288,9 +284,8 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation
MemberList GetMemberList()
{
var result = this.memberList;
var result = LazyInit.VolatileRead(ref this.memberList);
if (result != null) {
LazyInit.ReadBarrier();
return result;
}
List<IUnresolvedMember> unresolvedMembers = new List<IUnresolvedMember>();
@ -506,9 +501,8 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation @@ -506,9 +501,8 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation
public IEnumerable<IType> DirectBaseTypes {
get {
IList<IType> result = this.directBaseTypes;
IList<IType> result = LazyInit.VolatileRead(ref this.directBaseTypes);
if (result != null) {
LazyInit.ReadBarrier();
return result;
} else {
result = CalculateDirectBaseTypes();

3
ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultUnresolvedAssembly.cs

@ -340,9 +340,8 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation @@ -340,9 +340,8 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation
IEnumerable<ITypeDefinition> INamespace.Types {
get {
var result = this.types;
var result = LazyInit.VolatileRead(ref this.types);
if (result != null) {
LazyInit.ReadBarrier();
return result;
} else {
var hashSet = new HashSet<ITypeDefinition>();

3
ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultUnresolvedAttribute.cs

@ -246,9 +246,8 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation @@ -246,9 +246,8 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation
public IList<KeyValuePair<IMember, ResolveResult>> NamedArguments {
get {
var namedArgs = this.namedArguments;
var namedArgs = LazyInit.VolatileRead(ref this.namedArguments);
if (namedArgs != null) {
LazyInit.ReadBarrier();
return namedArgs;
} else {
namedArgs = new List<KeyValuePair<IMember, ResolveResult>>();

3
ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultUnresolvedParameter.cs

@ -234,9 +234,8 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation @@ -234,9 +234,8 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation
public object ConstantValue {
get {
ResolveResult rr = this.resolvedDefaultValue;
ResolveResult rr = LazyInit.VolatileRead(ref this.resolvedDefaultValue);
if (rr != null) {
LazyInit.ReadBarrier();
return rr.ConstantValue;
} else {
rr = defaultValue.Resolve(context);

3
ICSharpCode.NRefactory/TypeSystem/Implementation/KnownTypeCache.cs

@ -36,9 +36,8 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation @@ -36,9 +36,8 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation
public IType FindType(KnownTypeCode typeCode)
{
IType type = knownTypes[(int)typeCode];
IType type = LazyInit.VolatileRead(ref knownTypes[(int)typeCode]);
if (type != null) {
LazyInit.ReadBarrier();
return type;
}
return LazyInit.GetOrSet(ref knownTypes[(int)typeCode], SearchType(typeCode));

3
ICSharpCode.NRefactory/TypeSystem/Implementation/MergedNamespace.cs

@ -111,9 +111,8 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation @@ -111,9 +111,8 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation
Dictionary<string, INamespace> GetChildNamespaces()
{
var result = this.childNamespaces;
var result = LazyInit.VolatileRead(ref this.childNamespaces);
if (result != null) {
LazyInit.ReadBarrier();
return result;
} else {
result = new Dictionary<string, INamespace>(compilation.NameComparer);

3
ICSharpCode.NRefactory/TypeSystem/Implementation/SimpleCompilation.cs

@ -110,9 +110,8 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation @@ -110,9 +110,8 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation
public INamespace RootNamespace {
get {
INamespace ns = this.rootNamespace;
INamespace ns = LazyInit.VolatileRead(ref this.rootNamespace);
if (ns != null) {
LazyInit.ReadBarrier();
return ns;
} else {
if (referencedAssemblies == null)

14
ICSharpCode.NRefactory/Utils/LazyInit.cs

@ -26,13 +26,15 @@ namespace ICSharpCode.NRefactory.Utils @@ -26,13 +26,15 @@ namespace ICSharpCode.NRefactory.Utils
{
public static class LazyInit
{
static volatile object barrier = null;
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1804:RemoveUnusedLocals", MessageId = "tmp",
Justification = "The volatile read is important to cause a read barrier.")]
public static void ReadBarrier()
public static T VolatileRead<T>(ref T location) where T : class
{
object tmp = barrier;
#if NET45
return Volatile.Read(ref location);
#else
T result = location;
Thread.MemoryBarrier();
return result;
#endif
}
/// <summary>

6
ICSharpCode.NRefactory/Utils/ProjectedList.cs

@ -40,9 +40,8 @@ namespace ICSharpCode.NRefactory.Utils @@ -40,9 +40,8 @@ namespace ICSharpCode.NRefactory.Utils
public TOutput this[int index] {
get {
TOutput output = items[index];
TOutput output = LazyInit.VolatileRead(ref items[index]);
if (output != null) {
LazyInit.ReadBarrier();
return output;
}
return LazyInit.GetOrSet(ref items[index], projection(input[index]));
@ -150,9 +149,8 @@ namespace ICSharpCode.NRefactory.Utils @@ -150,9 +149,8 @@ namespace ICSharpCode.NRefactory.Utils
public TOutput this[int index] {
get {
TOutput output = items[index];
TOutput output = LazyInit.VolatileRead(ref items[index]);
if (output != null) {
LazyInit.ReadBarrier();
return output;
}
return LazyInit.GetOrSet(ref items[index], projection(context, input[index]));

Loading…
Cancel
Save