Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/aspnetwebstack.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbradwilson <dotnetguy@gmail.com>2012-03-26 04:58:29 +0400
committerbradwilson <dotnetguy@gmail.com>2012-03-28 01:04:30 +0400
commit1aa4404f90bd6bb6ef82a590dda8f89c7790521c (patch)
tree47e10b718a0a1ba98101a05d96e6d9aee95d6b2d /src/System.Web.Mvc
parent22f5ed114fb4b9dc264f0402d7b107bbad8a6493 (diff)
386159/386164: Review all double-check locks
Diffstat (limited to 'src/System.Web.Mvc')
-rw-r--r--src/System.Web.Mvc/Async/TaskAsyncActionDescriptor.cs3
-rw-r--r--src/System.Web.Mvc/ControllerTypeCache.cs2
-rw-r--r--src/System.Web.Mvc/MultiServiceResolver.cs18
-rw-r--r--src/System.Web.Mvc/SingleServiceResolver.cs32
-rw-r--r--src/System.Web.Mvc/UrlRewriterHelper.cs2
5 files changed, 19 insertions, 38 deletions
diff --git a/src/System.Web.Mvc/Async/TaskAsyncActionDescriptor.cs b/src/System.Web.Mvc/Async/TaskAsyncActionDescriptor.cs
index 22e8e8b1..8f957861 100644
--- a/src/System.Web.Mvc/Async/TaskAsyncActionDescriptor.cs
+++ b/src/System.Web.Mvc/Async/TaskAsyncActionDescriptor.cs
@@ -131,8 +131,7 @@ namespace System.Web.Mvc.Async
tokenSource.Cancel();
}
}
- },
- state: null, dueTime: timeout, period: Timeout.Infinite);
+ }, state: null, dueTime: timeout, period: Timeout.Infinite);
}
Task taskUser = dispatcher.Execute(controllerContext.Controller, parametersArray) as Task;
diff --git a/src/System.Web.Mvc/ControllerTypeCache.cs b/src/System.Web.Mvc/ControllerTypeCache.cs
index 7b560f4a..a4a8ca7a 100644
--- a/src/System.Web.Mvc/ControllerTypeCache.cs
+++ b/src/System.Web.Mvc/ControllerTypeCache.cs
@@ -7,7 +7,7 @@ namespace System.Web.Mvc
{
private const string TypeCacheName = "MVC-ControllerTypeCache.xml";
- private Dictionary<string, ILookup<string, Type>> _cache;
+ private volatile Dictionary<string, ILookup<string, Type>> _cache;
private object _lockObj = new object();
internal int Count
diff --git a/src/System.Web.Mvc/MultiServiceResolver.cs b/src/System.Web.Mvc/MultiServiceResolver.cs
index d3506fa2..0eedd385 100644
--- a/src/System.Web.Mvc/MultiServiceResolver.cs
+++ b/src/System.Web.Mvc/MultiServiceResolver.cs
@@ -6,7 +6,7 @@ namespace System.Web.Mvc
internal class MultiServiceResolver<TService> : IResolver<IEnumerable<TService>>
where TService : class
{
- private IEnumerable<TService> _itemsFromService;
+ private Lazy<IEnumerable<TService>> _itemsFromService;
private Func<IEnumerable<TService>> _itemsThunk;
private Func<IDependencyResolver> _resolverThunk;
@@ -19,6 +19,7 @@ namespace System.Web.Mvc
_itemsThunk = itemsThunk;
_resolverThunk = () => DependencyResolver.Current;
+ _itemsFromService = new Lazy<IEnumerable<TService>>(() => _resolverThunk().GetServices<TService>());
}
internal MultiServiceResolver(Func<IEnumerable<TService>> itemsThunk, IDependencyResolver resolver)
@@ -32,20 +33,7 @@ namespace System.Web.Mvc
public IEnumerable<TService> Current
{
- get
- {
- if (_itemsFromService == null)
- {
- lock (_itemsThunk)
- {
- if (_itemsFromService == null)
- {
- _itemsFromService = _resolverThunk().GetServices<TService>();
- }
- }
- }
- return _itemsFromService.Concat(_itemsThunk());
- }
+ get { return _itemsFromService.Value.Concat(_itemsThunk()); }
}
}
}
diff --git a/src/System.Web.Mvc/SingleServiceResolver.cs b/src/System.Web.Mvc/SingleServiceResolver.cs
index b1f5c344..ae2400c0 100644
--- a/src/System.Web.Mvc/SingleServiceResolver.cs
+++ b/src/System.Web.Mvc/SingleServiceResolver.cs
@@ -6,7 +6,7 @@ namespace System.Web.Mvc
internal class SingleServiceResolver<TService> : IResolver<TService>
where TService : class
{
- private TService _currentValueFromResolver;
+ private Lazy<TService> _currentValueFromResolver;
private Func<TService> _currentValueThunk;
private TService _defaultValue;
private Func<IDependencyResolver> _resolverThunk;
@@ -24,6 +24,7 @@ namespace System.Web.Mvc
}
_resolverThunk = () => DependencyResolver.Current;
+ _currentValueFromResolver = new Lazy<TService>(GetValueFromResolver);
_currentValueThunk = currentValueThunk;
_defaultValue = defaultValue;
_callerMethodName = callerMethodName;
@@ -40,26 +41,19 @@ namespace System.Web.Mvc
public TService Current
{
- get
- {
- if (_resolverThunk != null)
- {
- lock (_currentValueThunk)
- {
- if (_resolverThunk != null)
- {
- _currentValueFromResolver = _resolverThunk().GetService<TService>();
- _resolverThunk = null;
+ get { return _currentValueFromResolver.Value ?? _currentValueThunk() ?? _defaultValue; }
+ }
+
+ private TService GetValueFromResolver()
+ {
+ TService result = _resolverThunk().GetService<TService>();
- if (_currentValueFromResolver != null && _currentValueThunk() != null)
- {
- throw new InvalidOperationException(String.Format(CultureInfo.CurrentCulture, MvcResources.SingleServiceResolver_CannotRegisterTwoInstances, typeof(TService).Name.ToString(), _callerMethodName));
- }
- }
- }
- }
- return _currentValueFromResolver ?? _currentValueThunk() ?? _defaultValue;
+ if (result != null && _currentValueThunk() != null)
+ {
+ throw new InvalidOperationException(String.Format(CultureInfo.CurrentCulture, MvcResources.SingleServiceResolver_CannotRegisterTwoInstances, typeof(TService).Name.ToString(), _callerMethodName));
}
+
+ return result;
}
}
}
diff --git a/src/System.Web.Mvc/UrlRewriterHelper.cs b/src/System.Web.Mvc/UrlRewriterHelper.cs
index 265f7202..5a08542b 100644
--- a/src/System.Web.Mvc/UrlRewriterHelper.cs
+++ b/src/System.Web.Mvc/UrlRewriterHelper.cs
@@ -9,7 +9,7 @@ namespace System.Web.Mvc
private object _lockObject = new object();
private bool _urlRewriterIsTurnedOnValue;
- private bool _urlRewriterIsTurnedOnCalculated = false;
+ private volatile bool _urlRewriterIsTurnedOnCalculated = false;
private static bool WasThisRequestRewritten(HttpContextBase httpContext)
{