diff --git a/src/Microsoft.AspNet.Server.Kestrel/Http/ListenerPrimary.cs b/src/Microsoft.AspNet.Server.Kestrel/Http/ListenerPrimary.cs index 2f71ef4690..386489e88e 100644 --- a/src/Microsoft.AspNet.Server.Kestrel/Http/ListenerPrimary.cs +++ b/src/Microsoft.AspNet.Server.Kestrel/Http/ListenerPrimary.cs @@ -17,7 +17,10 @@ namespace Microsoft.AspNet.Server.Kestrel.Http { private List _dispatchPipes = new List(); private int _dispatchIndex; - private ArraySegment> _binaryOneTwoThreeFour = new ArraySegment>(new[] { new ArraySegment(new byte[] { 1, 2, 3, 4 }) }); + + // this message is passed to write2 because it must be non-zero-length, + // but it has no other functional significance + private readonly ArraySegment> _dummyMessage = new ArraySegment>(new[] { new ArraySegment(new byte[] { 1, 2, 3, 4 }) }); protected ListenerPrimary(IMemoryPool memory) : base(memory) { @@ -79,7 +82,7 @@ namespace Microsoft.AspNet.Server.Kestrel.Http write.Init(Thread.Loop); write.Write2( dispatchPipe, - _binaryOneTwoThreeFour, + _dummyMessage, socket, (write2, status, error, state) => { diff --git a/src/Microsoft.AspNet.Server.Kestrel/Infrastructure/KestrelThread.cs b/src/Microsoft.AspNet.Server.Kestrel/Infrastructure/KestrelThread.cs index 0f051b2e15..5a0338d899 100644 --- a/src/Microsoft.AspNet.Server.Kestrel/Infrastructure/KestrelThread.cs +++ b/src/Microsoft.AspNet.Server.Kestrel/Infrastructure/KestrelThread.cs @@ -16,7 +16,7 @@ namespace Microsoft.AspNet.Server.Kestrel /// public class KestrelThread { - private static Action _objectCallback = (cb, obj) => ((Action)cb).Invoke(obj); + private static Action _objectCallbackAdapter = (callback, state) => ((Action)callback).Invoke(state); private KestrelEngine _engine; private Thread _thread; private UvLoopHandle _loop; @@ -103,7 +103,7 @@ namespace Microsoft.AspNet.Server.Kestrel { lock (_workSync) { - _workAdding.Enqueue(new Work { Callback1 = _objectCallback, Callback2 = callback, State = state }); + _workAdding.Enqueue(new Work { CallbackAdapter = _objectCallbackAdapter, Callback = callback, State = state }); } _post.Send(); } @@ -114,8 +114,8 @@ namespace Microsoft.AspNet.Server.Kestrel { _workAdding.Enqueue(new Work { - Callback1 = (state1, state2) => ((Action)state1).Invoke((T)state2), - Callback2 = callback, + CallbackAdapter = (callback2, state2) => ((Action)callback2).Invoke((T)state2), + Callback = callback, State = state }); } @@ -129,8 +129,8 @@ namespace Microsoft.AspNet.Server.Kestrel { _workAdding.Enqueue(new Work { - Callback1 = _objectCallback, - Callback2 = callback, + CallbackAdapter = _objectCallbackAdapter, + Callback = callback, State = state, Completion = tcs }); @@ -146,8 +146,8 @@ namespace Microsoft.AspNet.Server.Kestrel { _workAdding.Enqueue(new Work { - Callback1 = (state1, state2) => ((Action)state1).Invoke((T)state2), - Callback2 = callback, + CallbackAdapter = (state1, state2) => ((Action)state1).Invoke((T)state2), + Callback = callback, State = state, Completion = tcs }); @@ -250,7 +250,7 @@ namespace Microsoft.AspNet.Server.Kestrel var work = queue.Dequeue(); try { - work.Callback1(work.Callback2, work.State); + work.CallbackAdapter(work.Callback, work.State); if (work.Completion != null) { ThreadPool.QueueUserWorkItem( @@ -299,8 +299,8 @@ namespace Microsoft.AspNet.Server.Kestrel private struct Work { - public Action Callback1; - public object Callback2; + public Action CallbackAdapter; + public object Callback; public object State; public TaskCompletionSource Completion; } diff --git a/src/Microsoft.AspNet.Server.Kestrel/Networking/Libuv.cs b/src/Microsoft.AspNet.Server.Kestrel/Networking/Libuv.cs index aa919e24e0..a266ff8cc8 100644 --- a/src/Microsoft.AspNet.Server.Kestrel/Networking/Libuv.cs +++ b/src/Microsoft.AspNet.Server.Kestrel/Networking/Libuv.cs @@ -395,6 +395,11 @@ namespace Microsoft.AspNet.Server.Kestrel.Networking public struct sockaddr { + // this type represents native memory occupied by sockaddr struct + // https://msdn.microsoft.com/en-us/library/windows/desktop/ms740496(v=vs.85).aspx + // although the c/c++ header defines it as a 2-byte short followed by a 14-byte array, + // the simplest way to reserve the same size in c# is with four nameless long values + private long _field0; private long _field1; private long _field2; @@ -405,8 +410,16 @@ namespace Microsoft.AspNet.Server.Kestrel.Networking public struct uv_buf_t { - public IntPtr _field0; - public IntPtr _field1; + // this type represents a WSABUF struct on Windows + // https://msdn.microsoft.com/en-us/library/windows/desktop/ms741542(v=vs.85).aspx + // and an iovec struct on *nix + // http://man7.org/linux/man-pages/man2/readv.2.html + // because the order of the fields in these structs is different, the field + // names in this type don't have meaningful symbolic names. instead, they are + // assigned in the correct order by the constructor at runtime + + private readonly IntPtr _field0; + private readonly IntPtr _field1; public uv_buf_t(IntPtr memory, int len, bool IsWindows) {