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) if (_frameHeaders != null)
{ {
RequestHeaders = null;
ResponseHeaders = null;
var frameHeaders = _frameHeaders; var frameHeaders = _frameHeaders;
_frameHeaders = null; _frameHeaders = null;
RequestHeaders = null;
ResponseHeaders = null;
HttpComponentFactory.DisposeHeaders(frameHeaders, poolingPermitted); HttpComponentFactory.DisposeHeaders(frameHeaders, poolingPermitted);
} }
if (_frameStreams != null) if (_frameStreams != null)
{ {
var frameStreams = _frameStreams;
_frameStreams = null;
RequestBody = null; RequestBody = null;
ResponseBody = null; ResponseBody = null;
DuplexStream = null; DuplexStream = null;
var frameStreams = _frameStreams;
_frameStreams = null;
HttpComponentFactory.DisposeStreams(frameStreams, poolingPermitted); HttpComponentFactory.DisposeStreams(frameStreams, poolingPermitted);
} }
} }

View File

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