Work around WriteBarrier assign for nulling struct (#7659)

This commit is contained in:
Ben Adams 2019-02-17 04:09:39 +00:00 committed by David Fowler
parent 0fd753bfc2
commit 4646ed5618
9 changed files with 50 additions and 15 deletions

View File

@ -15,6 +15,20 @@ namespace Microsoft.AspNetCore.Http.Features
Revision = collection.Revision; 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 IFeatureCollection Collection { get; private set; }
public int Revision { get; private set; } public int Revision { get; private set; }

View File

@ -40,18 +40,19 @@ namespace Microsoft.AspNetCore.Http
public DefaultHttpContext(IFeatureCollection features) public DefaultHttpContext(IFeatureCollection features)
{ {
_features = new FeatureReferences<FeatureInterfaces>(features); _features.Initalize(features);
_request = new DefaultHttpRequest(this); _request = new DefaultHttpRequest(this);
_response = new DefaultHttpResponse(this); _response = new DefaultHttpResponse(this);
} }
public void Initialize(IFeatureCollection features) public void Initialize(IFeatureCollection features)
{ {
_features = new FeatureReferences<FeatureInterfaces>(features); var revision = features.Revision;
_request.Initialize(); _features.Initalize(features, revision);
_response.Initialize(); _request.Initialize(revision);
_connection?.Initialize(features); _response.Initialize(revision);
_websockets?.Initialize(features); _connection?.Initialize(features, revision);
_websockets?.Initialize(features, revision);
} }
public void Uninitialize() public void Uninitialize()

View File

@ -34,7 +34,7 @@ namespace Microsoft.AspNetCore.Http.Features
throw new ArgumentNullException(nameof(features)); throw new ArgumentNullException(nameof(features));
} }
_features = new FeatureReferences<IHttpRequestFeature>(features); _features.Initalize(features);
} }
private IHttpRequestFeature HttpRequestFeature => private IHttpRequestFeature HttpRequestFeature =>

View File

@ -35,7 +35,7 @@ namespace Microsoft.AspNetCore.Http.Features
throw new ArgumentNullException(nameof(features)); throw new ArgumentNullException(nameof(features));
} }
_features = new FeatureReferences<IHttpRequestFeature>(features); _features.Initalize(features);
} }
private IHttpRequestFeature HttpRequestFeature => private IHttpRequestFeature HttpRequestFeature =>

View File

@ -46,7 +46,7 @@ namespace Microsoft.AspNetCore.Http.Features
throw new ArgumentNullException(nameof(features)); throw new ArgumentNullException(nameof(features));
} }
_features = new FeatureReferences<IHttpResponseFeature>(features); _features.Initalize(features);
} }
private IHttpResponseFeature HttpResponseFeature => _features.Fetch(ref _features.Cache, _nullResponseFeature); private IHttpResponseFeature HttpResponseFeature => _features.Fetch(ref _features.Cache, _nullResponseFeature);

View File

@ -25,7 +25,12 @@ namespace Microsoft.AspNetCore.Http.Internal
public void Initialize( IFeatureCollection features) public void Initialize( IFeatureCollection features)
{ {
_features = new FeatureReferences<FeatureInterfaces>(features); _features.Initalize(features);
}
public void Initialize(IFeatureCollection features, int revision)
{
_features.Initalize(features, revision);
} }
public void Uninitialize() public void Uninitialize()

View File

@ -28,12 +28,17 @@ namespace Microsoft.AspNetCore.Http.Internal
public DefaultHttpRequest(DefaultHttpContext context) public DefaultHttpRequest(DefaultHttpContext context)
{ {
_context = context; _context = context;
_features = new FeatureReferences<FeatureInterfaces>(_context.Features); _features.Initalize(context.Features);
} }
public void Initialize() public void Initialize()
{ {
_features = new FeatureReferences<FeatureInterfaces>(_context.Features); _features.Initalize(_context.Features);
}
public void Initialize(int revision)
{
_features.Initalize(_context.Features, revision);
} }
public void Uninitialize() public void Uninitialize()

View File

@ -25,12 +25,17 @@ namespace Microsoft.AspNetCore.Http.Internal
public DefaultHttpResponse(DefaultHttpContext context) public DefaultHttpResponse(DefaultHttpContext context)
{ {
_context = context; _context = context;
_features = new FeatureReferences<FeatureInterfaces>(_context.Features); _features.Initalize(context.Features);
} }
public void Initialize() public void Initialize()
{ {
_features = new FeatureReferences<FeatureInterfaces>(_context.Features); _features.Initalize(_context.Features);
}
public void Initialize(int revision)
{
_features.Initalize(_context.Features, revision);
} }
public void Uninitialize() public void Uninitialize()

View File

@ -25,7 +25,12 @@ namespace Microsoft.AspNetCore.Http.Internal
public void Initialize(IFeatureCollection features) public void Initialize(IFeatureCollection features)
{ {
_features = new FeatureReferences<FeatureInterfaces>(features); _features.Initalize(features);
}
public void Initialize(IFeatureCollection features, int revision)
{
_features.Initalize(features, revision);
} }
public void Uninitialize() public void Uninitialize()