Moving non-changing methods into .cs partial

This commit is contained in:
Louis DeJardin 2015-10-08 12:35:20 -07:00
parent ccfeef6353
commit 29b0b124ee
3 changed files with 41 additions and 76 deletions

View File

@ -6,10 +6,8 @@ using System.Collections;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNet.Http.Features; using Microsoft.AspNet.Http.Features;
using Microsoft.AspNet.Server.Kestrel.Http;
using Microsoft.Extensions.Primitives; using Microsoft.Extensions.Primitives;
namespace Microsoft.AspNet.Server.Kestrel.Http namespace Microsoft.AspNet.Server.Kestrel.Http
@ -34,6 +32,42 @@ namespace Microsoft.AspNet.Server.Kestrel.Http
_featureRevision++; _featureRevision++;
} }
private object ExtraFeatureGet(Type key)
{
if (MaybeExtra == null)
{
return null;
}
for (var i = 0; i < MaybeExtra.Count; i++)
{
var kv = MaybeExtra[i];
if (kv.Key == key)
{
return kv.Value;
}
}
return null;
}
private void ExtraFeatureSet(Type key, object value)
{
if (MaybeExtra == null)
{
MaybeExtra = new List<KeyValuePair<Type, object>>(2);
}
for (var i = 0; i < MaybeExtra.Count; i++)
{
if (MaybeExtra[i].Key == key)
{
MaybeExtra[i] = new KeyValuePair<Type, object>(key, value);
return;
}
}
MaybeExtra.Add(new KeyValuePair<Type, object>(key, value));
}
string IHttpRequestFeature.Protocol string IHttpRequestFeature.Protocol
{ {
get get

View File

@ -172,52 +172,8 @@ namespace Microsoft.AspNet.Server.Kestrel.Http
{ {
return _currentIHttpSendFileFeature; return _currentIHttpSendFileFeature;
} }
return SlowFeatureGet(key);
}
private object SlowFeatureGet(Type key) return ExtraFeatureGet(key);
{
if (MaybeExtra == null)
{
if ((_featureOverridenFlags & flagIHttpConnectionFeature) == 0L)
{
return this;
}
return SlowFeatureGet(key);
}
if (key == ITlsConnectionFeatureType)
{
if ((_featureOverridenFlags & flagITlsConnectionFeature) == 0L)
{
return this;
}
return SlowFeatureGet(key);
}
if (key == IHttpUpgradeFeatureType)
{
if ((_featureOverridenFlags & flagIHttpUpgradeFeature) == 0L)
{
return this;
}
return SlowFeatureGet(key);
}
if (key == IHttpWebSocketFeatureType)
{
if ((_featureOverridenFlags & flagIHttpWebSocketFeature) == 0L)
{
return this;
}
return SlowFeatureGet(key);
}
if (key == ISessionFeatureType)
{
if ((_featureOverridenFlags & flagISessionFeature) == 0L)
{
return this;
}
return SlowFeatureGet(key);
}
return SlowFeatureGet(key);
} }
@ -333,7 +289,7 @@ namespace Microsoft.AspNet.Server.Kestrel.Http
_currentIHttpSendFileFeature = feature; _currentIHttpSendFileFeature = feature;
return; return;
}; };
SetExtra(key, feature); ExtraFeatureSet(key, feature);
} }
private IEnumerable<KeyValuePair<Type, object>> FastEnumerable() private IEnumerable<KeyValuePair<Type, object>> FastEnumerable()

View File

@ -79,35 +79,10 @@ namespace Microsoft.AspNet.Server.Kestrel.Http
{{ {{
return _current{feature.Name}; return _current{feature.Name};
}}")} }}")}
return SlowFeatureGet(key);
return ExtraFeatureGet(key);
}} }}
private object SlowFeatureGet(Type key)
{{
object feature = null;
if (MaybeExtra?.TryGetValue(key, out feature) ?? false)
{{
return feature;
}}
return null;
}}
private void FastFeatureSetInner(long flag, Type key, object feature)
{{
Extra[key] = feature;
// Altering only an individual bit of the long
// so need to make sure other concurrent bit changes are not overridden
// in an atomic yet lock-free manner
long currentFeatureFlags;
long updatedFeatureFlags;
do
{{
currentFeatureFlags = _featureOverridenFlags;
updatedFeatureFlags = currentFeatureFlags | flag;
}} while (System.Threading.Interlocked.CompareExchange(ref _featureOverridenFlags, updatedFeatureFlags, currentFeatureFlags) != currentFeatureFlags);
private void FastFeatureSet(Type key, object feature) private void FastFeatureSet(Type key, object feature)
{{ {{
_featureRevision++; _featureRevision++;
@ -117,7 +92,7 @@ namespace Microsoft.AspNet.Server.Kestrel.Http
_current{feature.Name} = feature; _current{feature.Name} = feature;
return; return;
}}")}; }}")};
SetExtra(key, feature); ExtraFeatureSet(key, feature);
}} }}
private IEnumerable<KeyValuePair<Type, object>> FastEnumerable() private IEnumerable<KeyValuePair<Type, object>> FastEnumerable()