diff --git a/src/Umbraco.Core/ReadLock.cs b/src/Umbraco.Core/ReadLock.cs index 4b36860c2d..7a933e5301 100644 --- a/src/Umbraco.Core/ReadLock.cs +++ b/src/Umbraco.Core/ReadLock.cs @@ -12,29 +12,22 @@ namespace Umbraco.Core /// /// Intended as an infrastructure class. /// - public class UpgradeableReadLock : IDisposable + public class ReadLock : IDisposable { private readonly ReaderWriterLockSlim _rwLock; - private bool _upgraded = false; /// /// Initializes a new instance of the class. /// - /// The rw lock. - public UpgradeableReadLock(ReaderWriterLockSlim rwLock) + public ReadLock(ReaderWriterLockSlim rwLock) { _rwLock = rwLock; - _rwLock.EnterUpgradeableReadLock(); + _rwLock.EnterReadLock(); } - public void UpgradeToWriteLock() - { - _rwLock.EnterWriteLock(); - } - void IDisposable.Dispose() { - _rwLock.ExitUpgradeableReadLock(); + _rwLock.ExitReadLock(); } } } diff --git a/src/Umbraco.Core/Umbraco.Core.csproj b/src/Umbraco.Core/Umbraco.Core.csproj index 9c5101ff36..10179a1284 100644 --- a/src/Umbraco.Core/Umbraco.Core.csproj +++ b/src/Umbraco.Core/Umbraco.Core.csproj @@ -45,8 +45,8 @@ Properties\SolutionInfo.cs - + diff --git a/src/Umbraco.Core/UpgradeableReadLock.cs b/src/Umbraco.Core/UpgradeableReadLock.cs index d6787b56f8..8a1108fc6f 100644 --- a/src/Umbraco.Core/UpgradeableReadLock.cs +++ b/src/Umbraco.Core/UpgradeableReadLock.cs @@ -12,23 +12,34 @@ namespace Umbraco.Core /// /// Intended as an infrastructure class. /// - public class ReadLock : IDisposable + public class UpgradeableReadLock : IDisposable { private readonly ReaderWriterLockSlim _rwLock; + private bool _upgraded = false; /// /// Initializes a new instance of the class. /// - /// The rw lock. - public ReadLock(ReaderWriterLockSlim rwLock) + /// The rw lock. + public UpgradeableReadLock(ReaderWriterLockSlim rwLock) { _rwLock = rwLock; - _rwLock.EnterReadLock(); + _rwLock.EnterUpgradeableReadLock(); } + public void UpgradeToWriteLock() + { + _rwLock.EnterWriteLock(); + _upgraded = true; + } + void IDisposable.Dispose() { - _rwLock.ExitReadLock(); + if (_upgraded) + { + _rwLock.ExitWriteLock(); + } + _rwLock.ExitUpgradeableReadLock(); } } } diff --git a/src/Umbraco.Web/Routing/RouteLookups.cs b/src/Umbraco.Web/Routing/RouteLookups.cs index 6abaa2e7f4..d7f6e0dbab 100644 --- a/src/Umbraco.Web/Routing/RouteLookups.cs +++ b/src/Umbraco.Web/Routing/RouteLookups.cs @@ -33,9 +33,10 @@ namespace Umbraco.Web.Routing /// public IEnumerable GetLookups() { - // FIXME - and then, we return a non-thread-safe collection ... WTF? - - return Lookups; + using(new ReadLock(Lock)) + { + return Lookups; + } } /// @@ -74,11 +75,11 @@ namespace Umbraco.Web.Routing /// public void InsertLookup(int index, IRequestDocumentResolver lookup) { - if (CheckExists(lookup)) - throw new InvalidOperationException("The lookup type " + lookup + " already exists in the lookup collection"); - - using (new WriteLock(Lock)) + using (var l = new UpgradeableReadLock(Lock)) { + if (CheckExists(lookup)) + throw new InvalidOperationException("The lookup type " + lookup + " already exists in the lookup collection"); + l.UpgradeToWriteLock(); Lookups.Insert(index, lookup); } } diff --git a/src/Umbraco.Web/umbraco.presentation/library.cs b/src/Umbraco.Web/umbraco.presentation/library.cs index d1df067bae..2eae155c4e 100644 --- a/src/Umbraco.Web/umbraco.presentation/library.cs +++ b/src/Umbraco.Web/umbraco.presentation/library.cs @@ -355,10 +355,10 @@ namespace umbraco /// String with a friendly url from a node public static string NiceUrl(int nodeID) { - // OK, how are we supposed to retrieve the NiceUrlResolver from here, - // bearing in mind that we don't want to instanciate a resolver + content store + ... - // for every NiceUrl call ?! - return Umbraco.Core.UmbracoContainer.Get().GetNiceUrl(nodeID); + return Umbraco.Web.UmbracoContext.Current + .DocumentRequest + .RoutingContext + .NiceUrlResolver.GetNiceUrl(nodeID); } /// @@ -380,10 +380,10 @@ namespace umbraco /// String with a friendly url with full domain from a node public static string NiceUrlWithDomain(int nodeID) { - // OK, how are we supposed to retrieve the NiceUrlResolver from here, - // bearing in mind that we don't want to instanciate a resolver + content store + ... - // for every NiceUrl call ?! - return Umbraco.Core.UmbracoContainer.Get().GetNiceUrl(nodeID, Umbraco.Web.UmbracoContext.Current.UmbracoUrl, true); + return Umbraco.Web.UmbracoContext.Current + .DocumentRequest + .RoutingContext + .NiceUrlResolver.GetNiceUrl(nodeID, Umbraco.Web.UmbracoContext.Current.UmbracoUrl, true); }