From be3a6bacbf65a0d3cfb1964f533bd6945a3df5dd Mon Sep 17 00:00:00 2001 From: Ben Adams Date: Sat, 16 Feb 2019 22:08:43 +0000 Subject: [PATCH] Work around WriteBarrier assign for nulling struct --- src/Http/Http.Features/src/FeatureReferences.cs | 14 ++++++++++++++ src/Http/Http/src/DefaultHttpContext.cs | 13 +++++++------ src/Http/Http/src/Features/QueryFeature.cs | 2 +- .../Http/src/Features/RequestCookiesFeature.cs | 2 +- .../Http/src/Features/ResponseCookiesFeature.cs | 2 +- .../Http/src/Internal/DefaultConnectionInfo.cs | 7 ++++++- src/Http/Http/src/Internal/DefaultHttpRequest.cs | 9 +++++++-- src/Http/Http/src/Internal/DefaultHttpResponse.cs | 9 +++++++-- .../Http/src/Internal/DefaultWebSocketManager.cs | 7 ++++++- 9 files changed, 50 insertions(+), 15 deletions(-) diff --git a/src/Http/Http.Features/src/FeatureReferences.cs b/src/Http/Http.Features/src/FeatureReferences.cs index 918a77fa9bee..54b04729188d 100644 --- a/src/Http/Http.Features/src/FeatureReferences.cs +++ b/src/Http/Http.Features/src/FeatureReferences.cs @@ -15,6 +15,20 @@ public FeatureReferences(IFeatureCollection collection) Revision = collection.Revision; } + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void Initalize(IFeatureCollection collection) + { + Revision = collection.Revision; + Collection = collection; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void Initalize(IFeatureCollection collection, int revision) + { + Revision = revision; + Collection = collection; + } + public IFeatureCollection Collection { get; private set; } public int Revision { get; private set; } diff --git a/src/Http/Http/src/DefaultHttpContext.cs b/src/Http/Http/src/DefaultHttpContext.cs index 0135d2d7ab64..65166b4e0c86 100644 --- a/src/Http/Http/src/DefaultHttpContext.cs +++ b/src/Http/Http/src/DefaultHttpContext.cs @@ -40,18 +40,19 @@ public DefaultHttpContext() public DefaultHttpContext(IFeatureCollection features) { - _features = new FeatureReferences(features); + _features.Initalize(features); _request = new DefaultHttpRequest(this); _response = new DefaultHttpResponse(this); } public void Initialize(IFeatureCollection features) { - _features = new FeatureReferences(features); - _request.Initialize(); - _response.Initialize(); - _connection?.Initialize(features); - _websockets?.Initialize(features); + var revision = features.Revision; + _features.Initalize(features, revision); + _request.Initialize(revision); + _response.Initialize(revision); + _connection?.Initialize(features, revision); + _websockets?.Initialize(features, revision); } public void Uninitialize() diff --git a/src/Http/Http/src/Features/QueryFeature.cs b/src/Http/Http/src/Features/QueryFeature.cs index 36781ef16eba..28af5515942c 100644 --- a/src/Http/Http/src/Features/QueryFeature.cs +++ b/src/Http/Http/src/Features/QueryFeature.cs @@ -34,7 +34,7 @@ public QueryFeature(IFeatureCollection features) throw new ArgumentNullException(nameof(features)); } - _features = new FeatureReferences(features); + _features.Initalize(features); } private IHttpRequestFeature HttpRequestFeature => diff --git a/src/Http/Http/src/Features/RequestCookiesFeature.cs b/src/Http/Http/src/Features/RequestCookiesFeature.cs index cd37b360a4ef..c657a663d4ee 100644 --- a/src/Http/Http/src/Features/RequestCookiesFeature.cs +++ b/src/Http/Http/src/Features/RequestCookiesFeature.cs @@ -35,7 +35,7 @@ public RequestCookiesFeature(IFeatureCollection features) throw new ArgumentNullException(nameof(features)); } - _features = new FeatureReferences(features); + _features.Initalize(features); } private IHttpRequestFeature HttpRequestFeature => diff --git a/src/Http/Http/src/Features/ResponseCookiesFeature.cs b/src/Http/Http/src/Features/ResponseCookiesFeature.cs index 0d9444b0f562..66cb8e86c714 100644 --- a/src/Http/Http/src/Features/ResponseCookiesFeature.cs +++ b/src/Http/Http/src/Features/ResponseCookiesFeature.cs @@ -46,7 +46,7 @@ public ResponseCookiesFeature(IFeatureCollection features, ObjectPool(features); + _features.Initalize(features); } private IHttpResponseFeature HttpResponseFeature => _features.Fetch(ref _features.Cache, _nullResponseFeature); diff --git a/src/Http/Http/src/Internal/DefaultConnectionInfo.cs b/src/Http/Http/src/Internal/DefaultConnectionInfo.cs index 96a00355ec9f..b2146e36c46e 100644 --- a/src/Http/Http/src/Internal/DefaultConnectionInfo.cs +++ b/src/Http/Http/src/Internal/DefaultConnectionInfo.cs @@ -25,7 +25,12 @@ public DefaultConnectionInfo(IFeatureCollection features) public void Initialize( IFeatureCollection features) { - _features = new FeatureReferences(features); + _features.Initalize(features); + } + + public void Initialize(IFeatureCollection features, int revision) + { + _features.Initalize(features, revision); } public void Uninitialize() diff --git a/src/Http/Http/src/Internal/DefaultHttpRequest.cs b/src/Http/Http/src/Internal/DefaultHttpRequest.cs index 55112b687e5d..70ec3cc43e58 100644 --- a/src/Http/Http/src/Internal/DefaultHttpRequest.cs +++ b/src/Http/Http/src/Internal/DefaultHttpRequest.cs @@ -28,12 +28,17 @@ public sealed class DefaultHttpRequest : HttpRequest public DefaultHttpRequest(DefaultHttpContext context) { _context = context; - _features = new FeatureReferences(_context.Features); + _features.Initalize(context.Features); } public void Initialize() { - _features = new FeatureReferences(_context.Features); + _features.Initalize(_context.Features); + } + + public void Initialize(int revision) + { + _features.Initalize(_context.Features, revision); } public void Uninitialize() diff --git a/src/Http/Http/src/Internal/DefaultHttpResponse.cs b/src/Http/Http/src/Internal/DefaultHttpResponse.cs index 6c6068e44152..55cbbb4df343 100644 --- a/src/Http/Http/src/Internal/DefaultHttpResponse.cs +++ b/src/Http/Http/src/Internal/DefaultHttpResponse.cs @@ -25,12 +25,17 @@ public sealed class DefaultHttpResponse : HttpResponse public DefaultHttpResponse(DefaultHttpContext context) { _context = context; - _features = new FeatureReferences(_context.Features); + _features.Initalize(context.Features); } public void Initialize() { - _features = new FeatureReferences(_context.Features); + _features.Initalize(_context.Features); + } + + public void Initialize(int revision) + { + _features.Initalize(_context.Features, revision); } public void Uninitialize() diff --git a/src/Http/Http/src/Internal/DefaultWebSocketManager.cs b/src/Http/Http/src/Internal/DefaultWebSocketManager.cs index e704d552e67b..34de127724ac 100644 --- a/src/Http/Http/src/Internal/DefaultWebSocketManager.cs +++ b/src/Http/Http/src/Internal/DefaultWebSocketManager.cs @@ -25,7 +25,12 @@ public DefaultWebSocketManager(IFeatureCollection features) public void Initialize(IFeatureCollection features) { - _features = new FeatureReferences(features); + _features.Initalize(features); + } + + public void Initialize(IFeatureCollection features, int revision) + { + _features.Initalize(features, revision); } public void Uninitialize()