diff options
author | bradwilson <dotnetguy@gmail.com> | 2012-03-26 04:58:29 +0400 |
---|---|---|
committer | bradwilson <dotnetguy@gmail.com> | 2012-03-28 01:04:30 +0400 |
commit | 1aa4404f90bd6bb6ef82a590dda8f89c7790521c (patch) | |
tree | 47e10b718a0a1ba98101a05d96e6d9aee95d6b2d /src/System.Web.Mvc | |
parent | 22f5ed114fb4b9dc264f0402d7b107bbad8a6493 (diff) |
386159/386164: Review all double-check locks
Diffstat (limited to 'src/System.Web.Mvc')
-rw-r--r-- | src/System.Web.Mvc/Async/TaskAsyncActionDescriptor.cs | 3 | ||||
-rw-r--r-- | src/System.Web.Mvc/ControllerTypeCache.cs | 2 | ||||
-rw-r--r-- | src/System.Web.Mvc/MultiServiceResolver.cs | 18 | ||||
-rw-r--r-- | src/System.Web.Mvc/SingleServiceResolver.cs | 32 | ||||
-rw-r--r-- | src/System.Web.Mvc/UrlRewriterHelper.cs | 2 |
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) { |