Skip to content

Commit

Permalink
Avoiding race condition when concurrently creating the same parameters.
Browse files Browse the repository at this point in the history
  • Loading branch information
bwanner committed May 18, 2016
1 parent 8021d61 commit b7321ff
Showing 1 changed file with 15 additions and 10 deletions.
25 changes: 15 additions & 10 deletions MetaLinq/Expressions/EditableParameterExpression.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@ public class EditableParameterExpression : EditableExpression
// Members
private static Dictionary<string, ParameterExpression> _usableParameters = new Dictionary<string, ParameterExpression>();

private static object _createParameterLock = new object();

// Properties
[DataMember]
public string Name
Expand Down Expand Up @@ -43,18 +45,21 @@ public EditableParameterExpression(Type type, string name)
// Methods
static public ParameterExpression CreateParameter(Type type, string name)
{
ParameterExpression parameter = null;
string key = type.AssemblyQualifiedName + Environment.NewLine + name;
if (_usableParameters.ContainsKey(key))
{
parameter = _usableParameters[key] as ParameterExpression;
}
else
lock (_createParameterLock) // Avoid concurrent modifications to _usableParameters
{
parameter = Expression.Parameter(type, name);
_usableParameters.Add(key, parameter);
ParameterExpression parameter = null;
string key = type.AssemblyQualifiedName + Environment.NewLine + name;
if (_usableParameters.ContainsKey(key))
{
parameter = _usableParameters[key] as ParameterExpression;
}
else
{
parameter = Expression.Parameter(type, name);
_usableParameters.Add(key, parameter);
}
return parameter;
}
return parameter;
}

public override Expression ToExpression()
Expand Down

0 comments on commit b7321ff

Please sign in to comment.