Skip to content

Commit 0e0e695

Browse files
committed
Only update RFC 1123 date once per second
1 parent 634eb65 commit 0e0e695

File tree

1 file changed

+51
-33
lines changed

1 file changed

+51
-33
lines changed

experimental/ManagedRIOHttpServer/Program.cs

Lines changed: 51 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -12,27 +12,48 @@ namespace ManagedRIOHttpServer
1212
{
1313
public sealed class Program
1414
{
15+
// Number of 100ns ticks per time unit
16+
private const long TicksPerMillisecond = 10000;
17+
private const long TicksPerSecond = TicksPerMillisecond * 1000;
18+
1519
static readonly string headersKeepAliveStr = "HTTP/1.1 200 OK\r\n" +
1620
"Content-Type: text/plain\r\n" +
1721
"Content-Length:13\r\n" +
1822
"Connection:keep-alive\r\n" +
1923
"Server:-RIO-\r\n" +
20-
"Date:";
24+
"Date:DDD, dd mmm yyyy hh:mm:ss GMT" +
25+
"\r\n\r\n";
2126

22-
private static byte[] _headersBytes = Encoding.UTF8.GetBytes(headersKeepAliveStr);
27+
private static byte[][] _headersBytesBuffers = new byte[][] {
28+
Encoding.ASCII.GetBytes(headersKeepAliveStr),
29+
Encoding.ASCII.GetBytes(headersKeepAliveStr)
30+
};
31+
private static byte[] _headersBytes;
2332

24-
static readonly string bodyStr = "\r\n\r\n" +
25-
"Hello, World!";
33+
private static readonly string bodyStr = "Hello, World!";
2634

2735
private static byte[] _bodyBytes = Encoding.UTF8.GetBytes(bodyStr);
36+
private static Timer UpdateDateTimer;
2837

38+
static Program()
39+
{
40+
var start = _headersBytesBuffers[0].Length - 33;
41+
var loop = 0u;
42+
UpdateDateTimer = new Timer((obj) =>
43+
{
44+
var date = DateTime.UtcNow.ToString("r");
45+
var index = (++loop) & 1;
46+
Encoding.ASCII.GetBytes(date, 0, date.Length, _headersBytesBuffers[index], start);
47+
_headersBytes = _headersBytesBuffers[index];
48+
}, null, 0, 1000);
49+
}
2950

3051
static void Main(string[] args)
3152
{
3253
Console.WriteLine("Starting Managed Registered IO Server");
3354
Console.WriteLine("* Hardware Accelerated SIMD: {0}", Vector.IsHardwareAccelerated);
3455
Console.WriteLine("* Vector<byte>.Count: {0}", Vector<byte>.Count);
35-
56+
3657
if (IntPtr.Size != 8)
3758
{
3859
Console.WriteLine("ManagedRIOHttpServer needs to be run in x64 mode");
@@ -101,8 +122,6 @@ static async Task ServeSocket(RIOTcpConnection socket)
101122

102123
var receiveTask = socket.ReceiveAsync(receiveBuffer0, CancellationToken.None);
103124

104-
var dateBytes = Encoding.UTF8.GetBytes("DDD, dd mmm yyyy hh:mm:ss GMT");
105-
106125

107126
var loop = 0;
108127
var overflow = 0;
@@ -174,7 +193,7 @@ static async Task ServeSocket(RIOTcpConnection socket)
174193

175194
var ul = r - 3;
176195
var hasStart = false;
177-
196+
178197

179198
for (var i = start; i < buffer.Length - Vector<byte>.Count; i += Vector<byte>.Count)
180199
{
@@ -273,17 +292,13 @@ static async Task ServeSocket(RIOTcpConnection socket)
273292
break;
274293
}
275294

276-
var date = DateTime.UtcNow.ToString("r");
277-
Encoding.UTF8.GetBytes(date, 0, dateBytes.Length, dateBytes, 0);
278295

279296
for (var i = 1; i < count; i++)
280297
{
281298
socket.QueueSend(headerBuffer, false);
282-
socket.QueueSend(new ArraySegment<byte>(dateBytes), false);
283299
socket.QueueSend(bodyBuffer, false);
284300
}
285301
socket.QueueSend(headerBuffer, false);
286-
socket.QueueSend(new ArraySegment<byte>(dateBytes), false);
287302
// force send if not more ready to recieve/pack
288303
var nextReady = receiveTask.IsCompleted;
289304
socket.QueueSend(bodyBuffer, (!nextReady));
@@ -301,27 +316,30 @@ static async Task ServeSocket(RIOTcpConnection socket)
301316
}
302317
}
303318

304-
305-
public static void LowerCaseSIMD(byte[] data)
306-
{
307-
var A = new Vector<byte>(65); // A
308-
var Z = new Vector<byte>(90); // Z
309-
310-
for (var o = 0; o < data.Length - Vector<byte>.Count; o += Vector<byte>.Count)
311-
{
312-
var v = new Vector<byte>(data, o);
313-
314-
v = Vector.ConditionalSelect(
315-
Vector.BitwiseAnd(
316-
Vector.GreaterThanOrEqual(v, A),
317-
Vector.LessThanOrEqual(v, Z)
318-
),
319-
Vector.BitwiseOr(new Vector<byte>(0x20), v), // 0010 0000
320-
v
321-
);
322-
v.CopyTo(data, o);
323-
}
324-
}
319+
//public static void LowerCaseSIMD(ArraySegment<byte> data)
320+
//{
321+
// if (data.Offset + data.Count + Vector<byte>.Count < data.Array.Length)
322+
// {
323+
// throw new ArgumentOutOfRangeException("Nope");
324+
// }
325+
// var A = new Vector<byte>(65); // A
326+
// var Z = new Vector<byte>(90); // Z
327+
328+
// for (var o = data.Offset; o < data.Count - Vector<byte>.Count; o += Vector<byte>.Count)
329+
// {
330+
// var v = new Vector<byte>(data.Array, o);
331+
332+
// v = Vector.ConditionalSelect(
333+
// Vector.BitwiseAnd(
334+
// Vector.GreaterThanOrEqual(v, A),
335+
// Vector.LessThanOrEqual(v, Z)
336+
// ),
337+
// Vector.BitwiseOr(new Vector<byte>(0x20), v), // 0010 0000
338+
// v
339+
// );
340+
// v.CopyTo(data.Array, o);
341+
// }
342+
//}
325343
}
326344

327345
}

0 commit comments

Comments
 (0)