public KestrelThread(KestrelEngine engine) { _engine = engine; _loop = new UvLoopHandle(); _post = new UvAsyncHandle(); _thread = new Thread(ThreadStart); QueueCloseHandle = PostCloseHandle; }
public KestrelThread(KestrelEngine engine) { _engine = engine; _appShutdown = engine.AppShutdown; _log = engine.Log; _loop = new UvLoopHandle(_log); _post = new UvAsyncHandle(_log); _thread = new Thread(ThreadStart); QueueCloseHandle = PostCloseHandle; }
public KestrelThread(KestrelEngine engine) { _engine = engine; _appLifetime = engine.AppLifetime; _log = engine.Log; _threadPool = engine.ThreadPool; _loop = new UvLoopHandle(_log); _post = new UvAsyncHandle(_log); _thread = new Thread(ThreadStart); _thread.Name = "KestrelThread - libuv"; QueueCloseHandle = PostCloseHandle; }
unsafe public MockLibuv() { _uv_write = UvWrite; _uv_async_send = postHandle => { _loopWh.Set(); return(0); }; _uv_async_init = (loop, postHandle, callback) => { _postHandle = postHandle; _onPost = callback; return(0); }; _uv_run = (loopHandle, mode) => { while (!_stopLoop) { _loopWh.Wait(); _loopWh.Reset(); _onPost(_postHandle.InternalGetHandle()); } return(0); }; _uv_ref = handle => { }; _uv_unref = handle => { _stopLoop = true; _loopWh.Set(); }; _uv_stop = handle => { _stopLoop = true; _loopWh.Set(); }; _uv_req_size = reqType => IntPtr.Size; _uv_loop_size = () => IntPtr.Size; _uv_handle_size = handleType => IntPtr.Size; _uv_loop_init = loop => 0; _uv_tcp_init = (loopHandle, tcpHandle) => 0; _uv_close = (handle, callback) => callback(handle); _uv_loop_close = handle => 0; _uv_walk = (loop, callback, ignore) => 0; }
private void RunLoop() { Uv = new Uv(); Loop = new UvLoopHandle(); Loop.Init(Uv); _postHandle = new UvAsyncHandle(); _postHandle.Init(Loop, OnPost, _queueCloseCallback); _running.Set(); Uv.run(Loop, 0); }
public EventThread(TransportEngine engine) { _engine = engine; //_appLifetime = engine.AppLifetime; _threadPool = engine.ThreadPool; _loop = new UvLoopHandle(); _post = new UvAsyncHandle(); _thread = new Thread(ThreadStart); _thread.Name = "Event Thread"; #if !DEBUG // Mark the thread as being as unimportant to keeping the process alive. // Don't do this for debug builds, so we know if the thread isn't terminating. _thread.IsBackground = true; #endif QueueCloseHandle = PostCloseHandle; QueueCloseAsyncHandle = EnqueueCloseHandle; }
public void AsyncCanBeSent() { var loop = new UvLoopHandle(_logger); loop.Init(_uv); var trigger = new UvAsyncHandle(_logger); var called = false; trigger.Init(loop, () => { called = true; trigger.Dispose(); }, (a, b) => { }); trigger.Send(); loop.Run(); loop.Dispose(); Assert.True(called); }
public LibuvThread(LibuvTransport transport) { _transport = transport; _appLifetime = transport.AppLifetime; _log = transport.Log; _loop = new UvLoopHandle(_log); _post = new UvAsyncHandle(_log); _thread = new Thread(ThreadStart); _thread.Name = nameof(LibuvThread); #if !DEBUG // Mark the thread as being as unimportant to keeping the process alive. // Don't do this for debug builds, so we know if the thread isn't terminating. _thread.IsBackground = true; #endif QueueCloseHandle = PostCloseHandle; QueueCloseAsyncHandle = EnqueueCloseHandle; BufferPool = new MemoryPool(); WriteReqPool = new WriteReqPool(this, _log); }
private void RunLoop() { Uv = new Uv(); Loop = new UvLoopHandle(); Loop.Init(Uv); _shutdownPostHandle = new UvAsyncHandle(); _shutdownPostHandle.Init(Loop, OnPost, _queueCloseCallback); _listenSocket = new UvTcpHandle(); _listenSocket.Init(Loop, _queueCloseCallback); _listenSocket.NoDelay(true); _listenSocket.Bind(new IPEndPoint(_ip, _port)); _listenSocket.Listen(10, _onConnectionCallback, this); Uv.run(Loop, 0); }
private void RunLoop() { Uv = new Uv(); Loop = new UvLoopHandle(); Loop.Init(Uv); _postHandle = new UvAsyncHandle(); _postHandle.Init(Loop, OnPost, null); _running.Set(); Uv.run(Loop, 0); _postHandle.Reference(); _postHandle.Dispose(); Uv.run(Loop, 0); Loop.Dispose(); }
private void RunLoop() { Uv = new Uv(); Loop = new UvLoopHandle(); Loop.Init(Uv); _shutdownPostHandle = new UvAsyncHandle(); _shutdownPostHandle.Init(Loop, OnPost, _queueCloseCallback); _connectSocket = new UvTcpHandle(); _connectSocket.Init(Loop, _queueCloseCallback); _connectSocket.NoDelay(true); var connectReq = new UvConnectRequest(); connectReq.Init(Loop); connectReq.Connect(_connectSocket, new IPEndPoint(_ip, _port), OnConnection, this); Uv.run(Loop, 0); }
private void RunLoop() { Uv = new Libuv(); Log = new KestrelTrace(new LoggerFactory().CreateLogger <UvTcpListener>()); Loop = new UvLoopHandle(Log); Loop.Init(Uv); _shutdownPostHandle = new UvAsyncHandle(Log); _shutdownPostHandle.Init(Loop, OnPost, _queueCloseCallback); _listenSocket = new UvTcpHandle(Log); _listenSocket.Init(Loop, _queueCloseCallback); _listenSocket.NoDelay(true); string host = null; if (_ip == IPAddress.Any) { host = "*"; } else if (_ip == IPAddress.Loopback) { host = "localhost"; } else { host = _ip.ToString(); } var url = $"http://{host}:{_port}"; var address = Microsoft.AspNetCore.Server.Kestrel.ServerAddress.FromUrl(url); _listenSocket.Bind(address); _listenSocket.Listen(10, _onConnectionCallback, this); Uv.run(Loop, 0); }
public KestrelThread(KestrelEngine engine) { _engine = engine; _appLifetime = engine.AppLifetime; _log = engine.Log; _threadPool = engine.ThreadPool; _shutdownTimeout = engine.ServerOptions.ShutdownTimeout; _loop = new UvLoopHandle(_log); _post = new UvAsyncHandle(_log); _thread = new Thread(ThreadStart); _thread.Name = "KestrelThread - libuv"; _heartbeatTimer = new UvTimerHandle(_log); #if !DEBUG // Mark the thread as being as unimportant to keeping the process alive. // Don't do this for debug builds, so we know if the thread isn't terminating. _thread.IsBackground = true; #endif QueueCloseHandle = PostCloseHandle; QueueCloseAsyncHandle = EnqueueCloseHandle; Memory = new MemoryPool(); WriteReqPool = new WriteReqPool(this, _log); ConnectionManager = new ConnectionManager(this, _threadPool); }
public LibuvThread(LibuvFunctions libuv, IHostApplicationLifetime appLifetime, MemoryPool <byte> pool, ILibuvTrace log, int maxLoops = 8) { _libuv = libuv; _appLifetime = appLifetime; _log = log; _loop = new UvLoopHandle(_log); _post = new UvAsyncHandle(_log); _maxLoops = maxLoops; _thread = new Thread(ThreadStart); #if !INNER_LOOP _thread.Name = nameof(LibuvThread); #endif #if !DEBUG // Mark the thread as being as unimportant to keeping the process alive. // Don't do this for debug builds, so we know if the thread isn't terminating. _thread.IsBackground = true; #endif QueueCloseHandle = PostCloseHandle; QueueCloseAsyncHandle = EnqueueCloseHandle; MemoryPool = pool; WriteReqPool = new WriteReqPool(this, _log); }
unsafe public MockLibuv() : base(onlyForTesting: true) { _stackTrace = Environment.StackTrace; OnWrite = (socket, buffers, triggerCompleted) => { triggerCompleted(0); return(0); }; _uv_write = UvWrite; _uv_async_send = postHandle => { lock (_postLock) { if (_completedOnPostTcs) { _onPostTcs = new TaskCompletionSource <object>(); _completedOnPostTcs = false; } PostCount++; _loopWh.Set(); } return(0); }; _uv_async_init = (loop, postHandle, callback) => { _postHandle = postHandle; _onPost = callback; return(0); }; _uv_run = (loopHandle, mode) => { while (!_stopLoop) { _loopWh.Wait(); KestrelThreadBlocker.Wait(); lock (_postLock) { _loopWh.Reset(); } _onPost(_postHandle.InternalGetHandle()); lock (_postLock) { // Allow the loop to be run again before completing // _onPostTcs given a nested uv_async_send call. if (!_loopWh.IsSet) { // Ensure any subsequent calls to uv_async_send // create a new _onPostTcs to be completed. _completedOnPostTcs = true; // Calling TrySetResult outside the lock to avoid deadlock // when the code attempts to call uv_async_send after awaiting // OnPostTask. Task.Run so the run loop doesn't block either. var onPostTcs = _onPostTcs; Task.Run(() => onPostTcs.TrySetResult(null)); } } } return(0); }; _uv_ref = handle => { }; _uv_unref = handle => { _stopLoop = true; _loopWh.Set(); }; _uv_stop = handle => { _stopLoop = true; _loopWh.Set(); }; _uv_req_size = reqType => IntPtr.Size; _uv_loop_size = () => IntPtr.Size; _uv_handle_size = handleType => IntPtr.Size; _uv_loop_init = loop => 0; _uv_tcp_init = (loopHandle, tcpHandle) => 0; _uv_close = (handle, callback) => callback(handle); _uv_loop_close = handle => 0; _uv_walk = (loop, callback, ignore) => 0; _uv_err_name = errno => IntPtr.Zero; _uv_strerror = errno => IntPtr.Zero; _uv_read_start = UvReadStart; _uv_read_stop = (handle) => { AllocCallback = null; ReadCallback = null; return(0); }; _uv_unsafe_async_send = handle => { throw new Exception($"Why is this getting called?{Environment.NewLine}{_stackTrace}"); }; _uv_timer_init = (loop, handle) => 0; _uv_timer_start = (handle, callback, timeout, repeat) => 0; _uv_timer_stop = handle => 0; _uv_now = (loop) => DateTime.UtcNow.Ticks / TimeSpan.TicksPerMillisecond; }
unsafe public MockLibuv() : base(onlyForTesting: true) { OnWrite = (socket, buffers, triggerCompleted) => { triggerCompleted(0); return(0); }; _uv_write = UvWrite; _uv_async_send = postHandle => { PostCount++; _loopWh.Set(); return(0); }; _uv_async_init = (loop, postHandle, callback) => { _postHandle = postHandle; _onPost = callback; return(0); }; _uv_run = (loopHandle, mode) => { while (!_stopLoop) { _loopWh.Wait(); _loopWh.Reset(); _onPost(_postHandle.InternalGetHandle()); } return(0); }; _uv_ref = handle => { }; _uv_unref = handle => { _stopLoop = true; _loopWh.Set(); }; _uv_stop = handle => { _stopLoop = true; _loopWh.Set(); }; _uv_req_size = reqType => IntPtr.Size; _uv_loop_size = () => IntPtr.Size; _uv_handle_size = handleType => IntPtr.Size; _uv_loop_init = loop => 0; _uv_tcp_init = (loopHandle, tcpHandle) => 0; _uv_close = (handle, callback) => callback(handle); _uv_loop_close = handle => 0; _uv_walk = (loop, callback, ignore) => 0; _uv_err_name = errno => IntPtr.Zero; _uv_strerror = errno => IntPtr.Zero; _uv_read_start = UvReadStart; _uv_read_stop = handle => 0; }