Fast header clear

This commit is contained in:
Ben Adams 2016-02-13 07:27:38 +00:00
parent f8aa1a676a
commit b473402cb1
3 changed files with 1020 additions and 1051 deletions

View File

@ -266,20 +266,22 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Http
{
if (_frameHeaders != null)
{
RequestHeaders = null;
ResponseHeaders = null;
var frameHeaders = _frameHeaders;
_frameHeaders = null;
RequestHeaders = null;
ResponseHeaders = null;
HttpComponentFactory.DisposeHeaders(frameHeaders, poolingPermitted);
}
if (_frameStreams != null)
{
var frameStreams = _frameStreams;
_frameStreams = null;
RequestBody = null;
ResponseBody = null;
DuplexStream = null;
var frameStreams = _frameStreams;
_frameStreams = null;
HttpComponentFactory.DisposeStreams(frameStreams, poolingPermitted);
}
}

View File

@ -216,10 +216,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Http
: "")}
private long _bits = 0;
{Each(loop.Headers, header => @"
private StringValues _" + header.Identifier + ";")}
{Each(loop.Headers.Where(header => header.EnhancedSetter), header => @"
private byte[] _raw" + header.Identifier + ";")}
private HeaderReferences _headers;
{Each(loop.Headers, header => $@"
public StringValues Header{header.Identifier}
{{
@ -227,23 +224,23 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Http
{{
if ({header.TestBit()})
{{
return _{header.Identifier};
return _headers._{header.Identifier};
}}
return StringValues.Empty;
}}
set
{{
{header.SetBit()};
_{header.Identifier} = value; {(header.EnhancedSetter == false ? "" : $@"
_raw{header.Identifier} = null;")}
_headers._{header.Identifier} = value; {(header.EnhancedSetter == false ? "" : $@"
_headers._raw{header.Identifier} = null;")}
}}
}}")}
{Each(loop.Headers.Where(header => header.EnhancedSetter), header => $@"
public void SetRaw{header.Identifier}(StringValues value, byte[] raw)
{{
{header.SetBit()};
_{header.Identifier} = value;
_raw{header.Identifier} = raw;
_headers._{header.Identifier} = value;
_headers._raw{header.Identifier} = raw;
}}")}
protected override int GetCountFast()
{{
@ -259,7 +256,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Http
{{
if ({header.TestBit()})
{{
return _{header.Identifier};
return _headers._{header.Identifier};
}}
else
{{
@ -285,7 +282,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Http
{{
if ({header.TestBit()})
{{
value = _{header.Identifier};
value = _headers._{header.Identifier};
return true;
}}
else
@ -309,8 +306,8 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Http
if (""{header.Name}"".Equals(key, StringComparison.OrdinalIgnoreCase))
{{
{header.SetBit()};
_{header.Identifier} = value;{(header.EnhancedSetter == false ? "" : $@"
_raw{header.Identifier} = null;")}
_headers._{header.Identifier} = value;{(header.EnhancedSetter == false ? "" : $@"
_headers._raw{header.Identifier} = null;")}
return;
}}
")}}}
@ -331,8 +328,8 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Http
ThrowDuplicateKeyException();
}}
{header.SetBit()};
_{header.Identifier} = value;{(header.EnhancedSetter == false ? "" : $@"
_raw{header.Identifier} = null;")}
_headers._{header.Identifier} = value;{(header.EnhancedSetter == false ? "" : $@"
_headers._raw{header.Identifier} = null;")}
return;
}}
")}}}
@ -351,8 +348,8 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Http
if ({header.TestBit()})
{{
{header.ClearBit()};
_{header.Identifier} = StringValues.Empty;{(header.EnhancedSetter == false ? "" : $@"
_raw{header.Identifier} = null;")}
_headers._{header.Identifier} = StringValues.Empty;{(header.EnhancedSetter == false ? "" : $@"
_headers._raw{header.Identifier} = null;")}
return true;
}}
else
@ -366,10 +363,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Http
return MaybeUnknown?.Remove(key) ?? false;
}}
protected override void ClearFast()
{{{(loop.ClassName != "FrameRequestHeaders" ? "" : Each(loop.Headers, header => $@"
if ({header.TestBit()}) _{header.Identifier} = default(StringValues);"))}
{{
_bits = 0;
_headers = default(HeaderReferences);
MaybeUnknown?.Clear();
}}
@ -387,7 +383,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Http
ThrowArgumentException();
}}
array[arrayIndex] = new KeyValuePair<string, StringValues>(""{header.Name}"", _{header.Identifier});
array[arrayIndex] = new KeyValuePair<string, StringValues>(""{header.Name}"", _headers._{header.Identifier});
++arrayIndex;
}}
")}
@ -399,12 +395,12 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Http
{Each(loop.Headers, header => $@"
if ({header.TestBit()})
{{ {(header.EnhancedSetter == false ? "" : $@"
if (_raw{header.Identifier} != null)
if (_headers._raw{header.Identifier} != null)
{{
output.CopyFrom(_raw{header.Identifier}, 0, _raw{header.Identifier}.Length);
output.CopyFrom(_headers._raw{header.Identifier}, 0, _headers._raw{header.Identifier}.Length);
}}
else ")}
foreach (var value in _{header.Identifier})
foreach (var value in _headers._{header.Identifier})
{{
if (value != null)
{{
@ -432,13 +428,13 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Http
{{
if ({header.TestBit()})
{{
_{header.Identifier} = AppendValue(_{header.Identifier}, value);
_headers._{header.Identifier} = AppendValue(_headers._{header.Identifier}, value);
}}
else
{{
{header.SetBit()};
_{header.Identifier} = new StringValues(value);{(header.EnhancedSetter == false ? "" : $@"
_raw{header.Identifier} = null;")}
_headers._{header.Identifier} = new StringValues(value);{(header.EnhancedSetter == false ? "" : $@"
_headers._raw{header.Identifier} = null;")}
}}
return;
}}
@ -451,6 +447,13 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Http
Unknown.TryGetValue(key, out existing);
Unknown[key] = AppendValue(existing, value);
}}" : "")}
private struct HeaderReferences
{{{Each(loop.Headers, header => @"
public StringValues _" + header.Identifier + ";")}
{Each(loop.Headers.Where(header => header.EnhancedSetter), header => @"
public byte[] _raw" + header.Identifier + ";")}
}}
public partial struct Enumerator
{{
public bool MoveNext()
@ -468,7 +471,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Http
state{header.Index}:
if ({header.TestBit()})
{{
_current = new KeyValuePair<string, StringValues>(""{header.Name}"", _collection._{header.Identifier});
_current = new KeyValuePair<string, StringValues>(""{header.Name}"", _collection._headers._{header.Identifier});
_state = {header.Index + 1};
return true;
}}