Add ServiceContext to make it easier to flow new services through ctors
This commit is contained in:
parent
1584d70e1f
commit
f10c989d90
|
|
@ -13,9 +13,8 @@ namespace Microsoft.AspNet.Server.Kestrel.Http
|
|||
/// </summary>
|
||||
public abstract class Listener : ListenerContext, IDisposable
|
||||
{
|
||||
protected Listener(IMemoryPool memory)
|
||||
protected Listener(ServiceContext serviceContext) : base(serviceContext)
|
||||
{
|
||||
Memory = memory;
|
||||
}
|
||||
|
||||
protected UvStreamHandle ListenSocket { get; private set; }
|
||||
|
|
|
|||
|
|
@ -10,11 +10,16 @@ namespace Microsoft.AspNet.Server.Kestrel.Http
|
|||
{
|
||||
public ListenerContext() { }
|
||||
|
||||
public ListenerContext(ListenerContext context)
|
||||
public ListenerContext(ServiceContext serviceContext)
|
||||
{
|
||||
Thread = context.Thread;
|
||||
Application = context.Application;
|
||||
Memory = context.Memory;
|
||||
Memory = serviceContext.Memory;
|
||||
}
|
||||
|
||||
public ListenerContext(ListenerContext listenerContext)
|
||||
{
|
||||
Thread = listenerContext.Thread;
|
||||
Application = listenerContext.Application;
|
||||
Memory = listenerContext.Memory;
|
||||
}
|
||||
|
||||
public KestrelThread Thread { get; set; }
|
||||
|
|
|
|||
|
|
@ -22,7 +22,7 @@ namespace Microsoft.AspNet.Server.Kestrel.Http
|
|||
// but it has no other functional significance
|
||||
private readonly ArraySegment<ArraySegment<byte>> _dummyMessage = new ArraySegment<ArraySegment<byte>>(new[] { new ArraySegment<byte>(new byte[] { 1, 2, 3, 4 }) });
|
||||
|
||||
protected ListenerPrimary(IMemoryPool memory) : base(memory)
|
||||
protected ListenerPrimary(ServiceContext serviceContext) : base(serviceContext)
|
||||
{
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -15,9 +15,8 @@ namespace Microsoft.AspNet.Server.Kestrel.Http
|
|||
/// </summary>
|
||||
public abstract class ListenerSecondary : ListenerContext, IDisposable
|
||||
{
|
||||
protected ListenerSecondary(IMemoryPool memory)
|
||||
protected ListenerSecondary(ServiceContext serviceContext) : base(serviceContext)
|
||||
{
|
||||
Memory = memory;
|
||||
}
|
||||
|
||||
UvPipeHandle DispatchPipe { get; set; }
|
||||
|
|
|
|||
|
|
@ -11,7 +11,7 @@ namespace Microsoft.AspNet.Server.Kestrel.Http
|
|||
/// </summary>
|
||||
public class PipeListener : Listener
|
||||
{
|
||||
public PipeListener(IMemoryPool memory) : base(memory)
|
||||
public PipeListener(ServiceContext serviceContext) : base(serviceContext)
|
||||
{
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -11,7 +11,7 @@ namespace Microsoft.AspNet.Server.Kestrel.Http
|
|||
/// </summary>
|
||||
public class PipeListenerPrimary : ListenerPrimary
|
||||
{
|
||||
public PipeListenerPrimary(IMemoryPool memory) : base(memory)
|
||||
public PipeListenerPrimary(ServiceContext serviceContext) : base(serviceContext)
|
||||
{
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -10,7 +10,7 @@ namespace Microsoft.AspNet.Server.Kestrel.Http
|
|||
/// </summary>
|
||||
public class PipeListenerSecondary : ListenerSecondary
|
||||
{
|
||||
public PipeListenerSecondary(IMemoryPool memory) : base(memory)
|
||||
public PipeListenerSecondary(ServiceContext serviceContext) : base(serviceContext)
|
||||
{
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -12,7 +12,7 @@ namespace Microsoft.AspNet.Server.Kestrel.Http
|
|||
/// </summary>
|
||||
public class TcpListener : Listener
|
||||
{
|
||||
public TcpListener(IMemoryPool memory) : base(memory)
|
||||
public TcpListener(ServiceContext serviceContext) : base(serviceContext)
|
||||
{
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -12,7 +12,7 @@ namespace Microsoft.AspNet.Server.Kestrel.Http
|
|||
/// </summary>
|
||||
public class TcpListenerPrimary : ListenerPrimary
|
||||
{
|
||||
public TcpListenerPrimary(IMemoryPool memory) : base(memory)
|
||||
public TcpListenerPrimary(ServiceContext serviceContext) : base(serviceContext)
|
||||
{
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -10,7 +10,7 @@ namespace Microsoft.AspNet.Server.Kestrel.Http
|
|||
/// </summary>
|
||||
public class TcpListenerSecondary : ListenerSecondary
|
||||
{
|
||||
public TcpListenerSecondary(IMemoryPool memory) : base(memory)
|
||||
public TcpListenerSecondary(ServiceContext serviceContext) : base(serviceContext)
|
||||
{
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -8,6 +8,7 @@ using System.Diagnostics;
|
|||
using System.Runtime.ExceptionServices;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using Microsoft.Dnx.Runtime;
|
||||
|
||||
namespace Microsoft.AspNet.Server.Kestrel
|
||||
{
|
||||
|
|
@ -18,6 +19,7 @@ namespace Microsoft.AspNet.Server.Kestrel
|
|||
{
|
||||
private static Action<object, object> _objectCallbackAdapter = (callback, state) => ((Action<object>)callback).Invoke(state);
|
||||
private KestrelEngine _engine;
|
||||
private readonly IApplicationShutdown _appShutdown;
|
||||
private Thread _thread;
|
||||
private UvLoopHandle _loop;
|
||||
private UvAsyncHandle _post;
|
||||
|
|
@ -29,9 +31,10 @@ namespace Microsoft.AspNet.Server.Kestrel
|
|||
private bool _stopImmediate = false;
|
||||
private ExceptionDispatchInfo _closeError;
|
||||
|
||||
public KestrelThread(KestrelEngine engine)
|
||||
public KestrelThread(KestrelEngine engine, ServiceContext serviceContext)
|
||||
{
|
||||
_engine = engine;
|
||||
_appShutdown = serviceContext.AppShutdown;
|
||||
_loop = new UvLoopHandle();
|
||||
_post = new UvAsyncHandle();
|
||||
_thread = new Thread(ThreadStart);
|
||||
|
|
@ -226,7 +229,7 @@ namespace Microsoft.AspNet.Server.Kestrel
|
|||
_closeError = ExceptionDispatchInfo.Capture(ex);
|
||||
// Request shutdown so we can rethrow this exception
|
||||
// in Stop which should be observable.
|
||||
_engine.AppShutdown.RequestShutdown();
|
||||
_appShutdown.RequestShutdown();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -14,6 +14,8 @@ namespace Microsoft.AspNet.Server.Kestrel
|
|||
{
|
||||
public class KestrelEngine : IDisposable
|
||||
{
|
||||
private readonly ServiceContext _serviceContext;
|
||||
|
||||
public KestrelEngine(ILibraryManager libraryManager, IApplicationShutdown appShutdownService)
|
||||
: this(appShutdownService)
|
||||
{
|
||||
|
|
@ -68,21 +70,23 @@ namespace Microsoft.AspNet.Server.Kestrel
|
|||
|
||||
private KestrelEngine(IApplicationShutdown appShutdownService)
|
||||
{
|
||||
AppShutdown = appShutdownService;
|
||||
_serviceContext = new ServiceContext
|
||||
{
|
||||
AppShutdown = appShutdownService,
|
||||
Memory = new MemoryPool()
|
||||
};
|
||||
|
||||
Threads = new List<KestrelThread>();
|
||||
Memory = new MemoryPool();
|
||||
}
|
||||
|
||||
public Libuv Libuv { get; private set; }
|
||||
public IMemoryPool Memory { get; set; }
|
||||
public IApplicationShutdown AppShutdown { get; private set; }
|
||||
public List<KestrelThread> Threads { get; private set; }
|
||||
|
||||
public void Start(int count)
|
||||
{
|
||||
for (var index = 0; index != count; ++index)
|
||||
{
|
||||
Threads.Add(new KestrelThread(this));
|
||||
Threads.Add(new KestrelThread(this, _serviceContext));
|
||||
}
|
||||
|
||||
foreach (var thread in Threads)
|
||||
|
|
@ -122,16 +126,16 @@ namespace Microsoft.AspNet.Server.Kestrel
|
|||
if (single)
|
||||
{
|
||||
var listener = usingPipes ?
|
||||
(Listener) new PipeListener(Memory) :
|
||||
new TcpListener(Memory);
|
||||
(Listener) new PipeListener(_serviceContext) :
|
||||
new TcpListener(_serviceContext);
|
||||
listeners.Add(listener);
|
||||
listener.StartAsync(scheme, host, port, thread, application).Wait();
|
||||
}
|
||||
else if (first)
|
||||
{
|
||||
var listener = usingPipes
|
||||
? (ListenerPrimary) new PipeListenerPrimary(Memory)
|
||||
: new TcpListenerPrimary(Memory);
|
||||
? (ListenerPrimary) new PipeListenerPrimary(_serviceContext)
|
||||
: new TcpListenerPrimary(_serviceContext);
|
||||
|
||||
listeners.Add(listener);
|
||||
listener.StartAsync(pipeName, scheme, host, port, thread, application).Wait();
|
||||
|
|
@ -139,8 +143,8 @@ namespace Microsoft.AspNet.Server.Kestrel
|
|||
else
|
||||
{
|
||||
var listener = usingPipes
|
||||
? (ListenerSecondary) new PipeListenerSecondary(Memory)
|
||||
: new TcpListenerSecondary(Memory);
|
||||
? (ListenerSecondary) new PipeListenerSecondary(_serviceContext)
|
||||
: new TcpListenerSecondary(_serviceContext);
|
||||
listeners.Add(listener);
|
||||
listener.StartAsync(pipeName, thread, application).Wait();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,15 @@
|
|||
// Copyright (c) .NET Foundation. All rights reserved.
|
||||
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||
|
||||
using Microsoft.AspNet.Server.Kestrel.Http;
|
||||
using Microsoft.Dnx.Runtime;
|
||||
|
||||
namespace Microsoft.AspNet.Server.Kestrel
|
||||
{
|
||||
public class ServiceContext
|
||||
{
|
||||
public IApplicationShutdown AppShutdown { get; set; }
|
||||
|
||||
public IMemoryPool Memory { get; set; }
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue