diff --git a/include/rest_rpc/rpc_connection.hpp b/include/rest_rpc/rpc_connection.hpp index 0dff924..d260d6b 100644 --- a/include/rest_rpc/rpc_connection.hpp +++ b/include/rest_rpc/rpc_connection.hpp @@ -63,7 +63,12 @@ public: socket_, asio::buffer(&header, sizeof(rest_rpc_header)), asio::as_tuple(asio::use_awaitable)); if (ec) { - REST_LOG_INFO << "read head error: " << ec.message(); + if (ec != asio::error::eof) { + REST_LOG_INFO << "read http head error: " << ec.message(); + } else { + REST_LOG_INFO << "read head error: " << ec.message(); + } + close(); break; } @@ -89,6 +94,7 @@ public: socket_, asio::buffer(body_), asio::as_tuple(asio::use_awaitable)); if (ec) { REST_LOG_WARNING << "read body error: " << ec.message(); + close(); break; } } @@ -153,16 +159,17 @@ public: return; } - asio::dispatch(socket_.get_executor(), - [this, need_cb, self = shared_from_this()] { - std::error_code ec; - socket_.shutdown(asio::socket_base::shutdown_both, ec); - socket_.close(ec); - if (need_cb && quit_cb_) { - quit_cb_(conn_id_); - } - has_closed_ = true; - }); + auto self = shared_from_this(); + asio::dispatch(socket_.get_executor(), [this, need_cb, self] { + std::error_code ec; + socket_.shutdown(asio::socket_base::shutdown_both, ec); + socket_.close(ec); + REST_LOG_INFO << "close socket " << need_cb; + if (need_cb && quit_cb_) { + quit_cb_(conn_id_); + } + has_closed_ = true; + }); } void set_last_time() { @@ -189,7 +196,7 @@ private: bool checkout_timeout_ = false; rpc_router &router_; bool cross_ending_; - uint32_t topic_id_; + std::atomic topic_id_; }; // zero or one arguments diff --git a/include/rest_rpc/rpc_server.hpp b/include/rest_rpc/rpc_server.hpp index 7a27f04..29d9c75 100644 --- a/include/rest_rpc/rpc_server.hpp +++ b/include/rest_rpc/rpc_server.hpp @@ -59,7 +59,7 @@ public: }); stop_timer_ = true; - + REST_LOG_INFO << "server stoping"; { std::scoped_lock lock(*conn_mtx_); for (auto &conn : conns_) { diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index b01d2d8..ca08e8b 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -6,9 +6,11 @@ include_directories( "../thirdparty/asio" ) +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=thread") +#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=thread") + add_executable(test_rest_rpc test_rest_rpc.cpp) add_test(NAME ${project_name} COMMAND test_rest_rpc) -#add_test(NAME test_rpc COMMAND test_rpc) add_executable(bench bench.cpp) \ No newline at end of file diff --git a/tests/test_rest_rpc.cpp b/tests/test_rest_rpc.cpp index fd2dd9c..5963787 100644 --- a/tests/test_rest_rpc.cpp +++ b/tests/test_rest_rpc.cpp @@ -97,7 +97,7 @@ asio::awaitable no_arg_coro1() { co_return "test"; } -// TODO: client pool, pub/sub +// TODO: client pool asio::awaitable test_router() { rpc_router router; router.register_handler();