@@ -12,27 +12,48 @@ namespace ManagedRIOHttpServer
12
12
{
13
13
public sealed class Program
14
14
{
15
+ // Number of 100ns ticks per time unit
16
+ private const long TicksPerMillisecond = 10000 ;
17
+ private const long TicksPerSecond = TicksPerMillisecond * 1000 ;
18
+
15
19
static readonly string headersKeepAliveStr = "HTTP/1.1 200 OK\r \n " +
16
20
"Content-Type: text/plain\r \n " +
17
21
"Content-Length:13\r \n " +
18
22
"Connection:keep-alive\r \n " +
19
23
"Server:-RIO-\r \n " +
20
- "Date:" ;
24
+ "Date:DDD, dd mmm yyyy hh:mm:ss GMT" +
25
+ "\r \n \r \n " ;
21
26
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 ;
23
32
24
- static readonly string bodyStr = "\r \n \r \n " +
25
- "Hello, World!" ;
33
+ private static readonly string bodyStr = "Hello, World!" ;
26
34
27
35
private static byte [ ] _bodyBytes = Encoding . UTF8 . GetBytes ( bodyStr ) ;
36
+ private static Timer UpdateDateTimer ;
28
37
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
+ }
29
50
30
51
static void Main ( string [ ] args )
31
52
{
32
53
Console . WriteLine ( "Starting Managed Registered IO Server" ) ;
33
54
Console . WriteLine ( "* Hardware Accelerated SIMD: {0}" , Vector . IsHardwareAccelerated ) ;
34
55
Console . WriteLine ( "* Vector<byte>.Count: {0}" , Vector < byte > . Count ) ;
35
-
56
+
36
57
if ( IntPtr . Size != 8 )
37
58
{
38
59
Console . WriteLine ( "ManagedRIOHttpServer needs to be run in x64 mode" ) ;
@@ -101,8 +122,6 @@ static async Task ServeSocket(RIOTcpConnection socket)
101
122
102
123
var receiveTask = socket . ReceiveAsync ( receiveBuffer0 , CancellationToken . None ) ;
103
124
104
- var dateBytes = Encoding . UTF8 . GetBytes ( "DDD, dd mmm yyyy hh:mm:ss GMT" ) ;
105
-
106
125
107
126
var loop = 0 ;
108
127
var overflow = 0 ;
@@ -174,7 +193,7 @@ static async Task ServeSocket(RIOTcpConnection socket)
174
193
175
194
var ul = r - 3 ;
176
195
var hasStart = false ;
177
-
196
+
178
197
179
198
for ( var i = start ; i < buffer . Length - Vector < byte > . Count ; i += Vector < byte > . Count )
180
199
{
@@ -273,17 +292,13 @@ static async Task ServeSocket(RIOTcpConnection socket)
273
292
break ;
274
293
}
275
294
276
- var date = DateTime . UtcNow . ToString ( "r" ) ;
277
- Encoding . UTF8 . GetBytes ( date , 0 , dateBytes . Length , dateBytes , 0 ) ;
278
295
279
296
for ( var i = 1 ; i < count ; i ++ )
280
297
{
281
298
socket . QueueSend ( headerBuffer , false ) ;
282
- socket . QueueSend ( new ArraySegment < byte > ( dateBytes ) , false ) ;
283
299
socket . QueueSend ( bodyBuffer , false ) ;
284
300
}
285
301
socket . QueueSend ( headerBuffer , false ) ;
286
- socket . QueueSend ( new ArraySegment < byte > ( dateBytes ) , false ) ;
287
302
// force send if not more ready to recieve/pack
288
303
var nextReady = receiveTask . IsCompleted ;
289
304
socket . QueueSend ( bodyBuffer , ( ! nextReady ) ) ;
@@ -301,27 +316,30 @@ static async Task ServeSocket(RIOTcpConnection socket)
301
316
}
302
317
}
303
318
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
+ //}
325
343
}
326
344
327
345
}
0 commit comments