Skip to content
This repository was archived by the owner on Dec 18, 2018. It is now read-only.

[For Testing] Bundled Memory Changes #386

Closed
wants to merge 30 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
25f7b7b
Pre-allocate memory pool
benaadams Nov 11, 2015
58d712f
Precomputed header bytes
benaadams Nov 11, 2015
72cfbab
Precompute Http Version bytes
benaadams Nov 11, 2015
9e57298
Use memmove rather than Array.Copy
benaadams Nov 12, 2015
fcb26f6
Precompute Server and Date bytes
benaadams Nov 12, 2015
3196165
use local vars
benaadams Nov 12, 2015
03243fd
Use bool rather than bit twiddel
benaadams Nov 13, 2015
846e597
Used descriptive const default value
benaadams Nov 13, 2015
4698797
Initialize the work queue sizes
benaadams Nov 11, 2015
cda22c3
Initalize SocketOutput Queues, Reuse WriteContexts
benaadams Nov 13, 2015
14cb795
Use pooled array
benaadams Nov 6, 2015
9f82d21
Use pooled array for header names
benaadams Nov 11, 2015
79c4a42
Use default value in constructor
benaadams Nov 13, 2015
7a6dd04
Dispose of MemoryPool2; suppress its finalizers
benaadams Nov 8, 2015
ee4d9c3
Dispose in tests
benaadams Nov 13, 2015
9037939
Resuse write requests
benaadams Nov 13, 2015
29f9f52
Reuse segment array
benaadams Nov 14, 2015
e237112
Initialize UvWriteReq pins size
benaadams Nov 14, 2015
65221c8
Remove closure alloc
benaadams Nov 14, 2015
78538c3
Skip non-consumed rather than reading
benaadams Nov 14, 2015
4c9a492
Less fine grained memory lease
benaadams Nov 14, 2015
b40e17f
ConcurrentStack to ConcurrentQueue
benaadams Nov 14, 2015
01b60d6
Add Async in method name
benaadams Nov 14, 2015
7f50736
Reduce GetString allocs and conversions
benaadams Nov 1, 2015
3e5d0ca
Merge remote-tracking branch 'refs/remotes/origin/used-pool-array' in…
benaadams Nov 14, 2015
bd64a80
Merge remote-tracking branch 'refs/remotes/origin/MemoryPoolIterator2…
benaadams Nov 14, 2015
6e3683b
Merge remote-tracking branch 'refs/remotes/origin/dispose-memorypool2…
benaadams Nov 14, 2015
8a5c632
Merge remote-tracking branch 'refs/remotes/origin/memory-pool' into s…
benaadams Nov 14, 2015
a7dd39e
Merge remote-tracking branch 'refs/remotes/origin/default-work-queues…
benaadams Nov 14, 2015
25e87e6
Merge remote-tracking branch 'refs/remotes/origin/faster-headers' int…
benaadams Nov 14, 2015
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 14 additions & 0 deletions src/Microsoft.AspNet.Server.Kestrel/Http/DateHeaderValueManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.

using System;
using System.Text;
using System.Threading;
using Microsoft.AspNet.Server.Kestrel.Infrastructure;

Expand All @@ -17,6 +18,9 @@ public class DateHeaderValueManager : IDisposable
private readonly TimeSpan _timerInterval;

private volatile string _dateValue;
private volatile bool _activeDateBytes;
private readonly byte[] _dateBytes0 = Encoding.ASCII.GetBytes("DDD, dd mmm yyyy hh:mm:ss GMT");
private readonly byte[] _dateBytes1 = Encoding.ASCII.GetBytes("DDD, dd mmm yyyy hh:mm:ss GMT");
private object _timerLocker = new object();
private bool _isDisposed = false;
private bool _hadRequestsSinceLastTimerTick = false;
Expand Down Expand Up @@ -62,6 +66,12 @@ public virtual string GetDateHeaderValue()
return _dateValue ?? _systemClock.UtcNow.ToString(Constants.RFC1123DateFormat);
}

public byte[] GetDateHeaderValueBytes()
{
PumpTimer();
return _activeDateBytes ? _dateBytes0 : _dateBytes1;
}

/// <summary>
/// Releases all resources used by the current instance of <see cref="DateHeaderValueManager"/>.
/// </summary>
Expand Down Expand Up @@ -92,6 +102,8 @@ private void PumpTimer()
// here as the timer won't fire until the timer interval has passed and we want a value assigned
// inline now to serve requests that occur in the meantime.
_dateValue = _systemClock.UtcNow.ToString(Constants.RFC1123DateFormat);
Encoding.ASCII.GetBytes(_dateValue, 0, _dateValue.Length, !_activeDateBytes ? _dateBytes0 : _dateBytes1, 0);
_activeDateBytes = !_activeDateBytes;
_dateValueTimer = new Timer(UpdateDateValue, state: null, dueTime: _timerInterval, period: _timerInterval);
}
}
Expand All @@ -105,6 +117,8 @@ private void UpdateDateValue(object state)

// See http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.18 for required format of Date header
_dateValue = now.ToString(Constants.RFC1123DateFormat);
Encoding.ASCII.GetBytes(_dateValue, 0, _dateValue.Length, !_activeDateBytes ? _dateBytes0 : _dateBytes1, 0);
_activeDateBytes = !_activeDateBytes;

if (_hadRequestsSinceLastTimerTick)
{
Expand Down
Loading