From 01b82ee4e89ef6c870249ab07d919c4da20e9248 Mon Sep 17 00:00:00 2001 From: Stephan Date: Thu, 14 Feb 2019 08:46:53 +0100 Subject: [PATCH] Bugfix HttpRequestAppCache locking --- src/Umbraco.Core/Cache/HttpRequestAppCache.cs | 20 ++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/src/Umbraco.Core/Cache/HttpRequestAppCache.cs b/src/Umbraco.Core/Cache/HttpRequestAppCache.cs index f1932f97ce..eeebcd2622 100644 --- a/src/Umbraco.Core/Cache/HttpRequestAppCache.cs +++ b/src/Umbraco.Core/Cache/HttpRequestAppCache.cs @@ -2,6 +2,7 @@ using System.Collections; using System.Collections.Generic; using System.Linq; +using System.Threading; using System.Web; namespace Umbraco.Core.Cache @@ -110,7 +111,7 @@ namespace Umbraco.Core.Cache #region Lock - private bool _entered; + private const string ContextItemsLockKey = "Umbraco.Core.Cache.HttpRequestCache::LockEntered"; protected override void EnterReadLock() => EnterWriteLock(); @@ -118,7 +119,13 @@ namespace Umbraco.Core.Cache { if (HasContextItems) { - System.Threading.Monitor.Enter(ContextItems.SyncRoot, ref _entered); + // note: cannot keep 'entered' as a class variable here, + // since there is one per request - so storing it within + // ContextItems - which is locked, so this should be safe + + var entered = false; + Monitor.Enter(ContextItems.SyncRoot, ref entered); + ContextItems[ContextItemsLockKey] = entered; } } @@ -126,11 +133,10 @@ namespace Umbraco.Core.Cache protected override void ExitWriteLock() { - if (_entered) - { - _entered = false; - System.Threading.Monitor.Exit(ContextItems.SyncRoot); - } + var entered = (bool?) ContextItems[ContextItemsLockKey] ?? false; + if (entered) + Monitor.Exit(ContextItems.SyncRoot); + ContextItems.Remove(ContextItemsLockKey); } #endregion