Пример #1
0
 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;
 }
Пример #3
0
 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;
 }
Пример #4
0
        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;
        }
Пример #5
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);
        }
Пример #6
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);
        }
Пример #8
0
        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);
        }
Пример #9
0
        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);
        }
Пример #10
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();
        }
Пример #11
0
        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);
        }
Пример #12
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);
        }
Пример #13
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);
        }
Пример #14
0
        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);
        }
Пример #15
0
        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;
        }
Пример #16
0
        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;
        }