Hi, Although I've never been able to reproduce it (neither in Linux nor in OSX) it seems that there is a bug in my libuv based C++ app related to TCP. I'm a little desperate because I've spent a lot of days trying to figure out where the issue is with no luck.
A user of my software (who runs it on Linux) is experimenting TCP related crashes. It's not even always the same coredump, but it seems to always be related to TCP. Could anyone tell me if there is something wrong here? ------------------------------------------------- void TcpConnection::Close() { MS_TRACE(); if (this->closed) return; int err; this->closed = true; // Tell the UV handle that the TcpConnection has been closed. this->uvHandle->data = nullptr; // Don't read more. err = uv_read_stop(reinterpret_cast<uv_stream_t*>(this->uvHandle)); if (err != 0) MS_ABORT("uv_read_stop() failed: %s", uv_strerror(err)); // If there is no error and the peer didn't close its connection side then close gracefully. if (!this->hasError && !this->isClosedByPeer) { // Use uv_shutdown() so pending data to be written will be sent to the peer // before closing. auto req = new uv_shutdown_t; req->data = static_cast<void*>(this); err = uv_shutdown( req, reinterpret_cast<uv_stream_t*>(this->uvHandle), static_cast<uv_shutdown_cb>(onShutdown)); if (err != 0) MS_ABORT("uv_shutdown() failed: %s", uv_strerror(err)); } // Otherwise directly close the socket. else { uv_close(reinterpret_cast<uv_handle_t*>(this->uvHandle), static_cast<uv_close_cb>(onClose)); } } ------------------------------------------------- This is, I do uv_shutdown() if the connection is still open and within the uv_shutdown_cb I call uv_close(). Otherwise, if the remote peer closed its TCP side I directly call to uv_close(): --------------------------------------------------- inline static void onClose(uv_handle_t* handle) { delete handle; } inline static void onShutdown(uv_shutdown_t* req, int /*status*/) { auto* handle = req->handle; delete req; // Now do close the handle. uv_close(reinterpret_cast<uv_handle_t*>(handle), static_cast<uv_close_cb>(onClose)); } --------------------------------------------------- Both this->hasError and this->isClosedByPeer are booleans set to true if there is an error in the uv_read_cb: ------------------------------------------------ inline void TcpConnection::OnUvRead(ssize_t nread, const uv_buf_t* /*buf*/) { MS_TRACE(); if (nread == 0) return; // Data received. if (nread > 0) { // Update received bytes. this->recvBytes += nread; // Update the buffer data length. this->bufferDataLen += static_cast<size_t>(nread); // Notify the subclass. UserOnTcpConnectionRead(); } // Client disconneted. else if (nread == UV_EOF || nread == UV_ECONNRESET) { MS_DEBUG_DEV("connection closed by peer, closing server side"); this->isClosedByPeer = true; // Close server side of the connection. Close(); // Notify the listener. this->listener->OnTcpConnectionClosed(this); } // Some error. else { MS_WARN_DEV("read error, closing the connection: %s", uv_strerror(nread)); this->hasError = true; // Close server side of the connection. Close(); // Notify the listener. this->listener->OnTcpConnectionClosed(this); } } ------------------------------------------------ The whole code is here: - https://github.com/versatica/mediasoup/blob/tcp-crash-wip/worker/src/handles/TcpConnection.cpp?ts=2 - https://github.com/versatica/mediasoup/blob/tcp-crash-wip/worker/include/handles/TcpConnection.hpp?ts=2 And an example coredump is here: https://mediasoup.discourse.group/t/error-worker-worker-process-died-unexpectedly/268/84?u=ibc I'm pretty sure everything is ok in the code above. Could anyone identify an issue into it? Really thanks a lot. -- Iñaki Baz Castillo <i...@aliax.net> -- You received this message because you are subscribed to the Google Groups "libuv" group. To unsubscribe from this group and stop receiving emails from it, send an email to libuv+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/libuv/CALiegf%3DhsERWve0k0O4Yut4SU9QPBXzbWuRS9s4une5xbyKwJw%40mail.gmail.com.