From 1aa4404f90bd6bb6ef82a590dda8f89c7790521c Mon Sep 17 00:00:00 2001 From: bradwilson Date: Sun, 25 Mar 2012 17:58:29 -0700 Subject: 386159/386164: Review all double-check locks --- .../Async/TaskAsyncActionDescriptor.cs | 3 +- src/System.Web.Mvc/ControllerTypeCache.cs | 2 +- src/System.Web.Mvc/MultiServiceResolver.cs | 18 ++---------- src/System.Web.Mvc/SingleServiceResolver.cs | 32 +++++++++------------- src/System.Web.Mvc/UrlRewriterHelper.cs | 2 +- 5 files changed, 19 insertions(+), 38 deletions(-) (limited to 'src/System.Web.Mvc') 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> _cache; + private volatile Dictionary> _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 : IResolver> where TService : class { - private IEnumerable _itemsFromService; + private Lazy> _itemsFromService; private Func> _itemsThunk; private Func _resolverThunk; @@ -19,6 +19,7 @@ namespace System.Web.Mvc _itemsThunk = itemsThunk; _resolverThunk = () => DependencyResolver.Current; + _itemsFromService = new Lazy>(() => _resolverThunk().GetServices()); } internal MultiServiceResolver(Func> itemsThunk, IDependencyResolver resolver) @@ -32,20 +33,7 @@ namespace System.Web.Mvc public IEnumerable Current { - get - { - if (_itemsFromService == null) - { - lock (_itemsThunk) - { - if (_itemsFromService == null) - { - _itemsFromService = _resolverThunk().GetServices(); - } - } - } - 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 : IResolver where TService : class { - private TService _currentValueFromResolver; + private Lazy _currentValueFromResolver; private Func _currentValueThunk; private TService _defaultValue; private Func _resolverThunk; @@ -24,6 +24,7 @@ namespace System.Web.Mvc } _resolverThunk = () => DependencyResolver.Current; + _currentValueFromResolver = new Lazy(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(); - _resolverThunk = null; + get { return _currentValueFromResolver.Value ?? _currentValueThunk() ?? _defaultValue; } + } + + private TService GetValueFromResolver() + { + TService result = _resolverThunk().GetService(); - 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) { -- cgit v1.2.3