From 6ea94abe4f05c781710e6ea92141387deea65106 Mon Sep 17 00:00:00 2001 From: qinzuoyan Date: Mon, 7 Dec 2015 13:23:56 +0800 Subject: [PATCH] fix coredump when destruct global RpcClient object --- .gitignore | 1 + depends.mk | 6 +++--- sample/echo/client_sync.cc | 9 ++++----- src/sofa/pbrpc/rpc_byte_stream.h | 8 ++++---- src/sofa/pbrpc/rpc_message_stream.h | 4 ++++ src/sofa/pbrpc/rpc_server_message_stream.h | 4 ++++ 6 files changed, 20 insertions(+), 12 deletions(-) diff --git a/.gitignore b/.gitignore index ff382aa..6d34044 100644 --- a/.gitignore +++ b/.gitignore @@ -16,6 +16,7 @@ unit-test/test_ext_closure unit-test/test_thread_group unit-test/test_timeout_manager unit-test/test_tran_buf_pool +unit-test/test_io_service_pool *.a sofa-pbrpc-client depends.mk diff --git a/depends.mk b/depends.mk index 548ef91..91eb1b9 100644 --- a/depends.mk +++ b/depends.mk @@ -16,7 +16,7 @@ ## $(BOOST_HEADER_DIR)/boost/smart_ptr.hpp ## #BOOST_HEADER_DIR=/home/users/qinzuoyan01/libs/boost_1_53_0 -BOOST_HEADER_DIR= +BOOST_HEADER_DIR=/usr ################################################################ ################################################################ @@ -28,7 +28,7 @@ BOOST_HEADER_DIR= ## $(PROTOBUF_DIR)/lib/libprotobuf.a ## #PROTOBUF_DIR=/home/users/qinzuoyan01/libs/protobuf-2.4.1/output -PROTOBUF_DIR=/usr/local/ +PROTOBUF_DIR=/usr/local ################################################################ ################################################################ @@ -39,7 +39,7 @@ PROTOBUF_DIR=/usr/local/ ## $(SNAPPY_DIR)/lib/libsnappy.a ## #SNAPPY_DIR=/home/users/qinzuoyan01/libs/snappy-1.1.1/output -SNAPPY_DIR= +SNAPPY_DIR=/usr ################################################################ ################################################################ diff --git a/sample/echo/client_sync.cc b/sample/echo/client_sync.cc index 1eebace..7b26ff5 100644 --- a/sample/echo/client_sync.cc +++ b/sample/echo/client_sync.cc @@ -7,17 +7,16 @@ #include #include "echo_service.pb.h" +// Using global RpcClient object can help share resources such as threads and buffers. +sofa::pbrpc::RpcClient g_rpc_client; + int main() { SOFA_PBRPC_SET_LOG_LEVEL(NOTICE); - // Define an rpc client. - sofa::pbrpc::RpcClientOptions client_options; - sofa::pbrpc::RpcClient rpc_client(client_options); - // Define an rpc channel. sofa::pbrpc::RpcChannelOptions channel_options; - sofa::pbrpc::RpcChannel rpc_channel(&rpc_client, "127.0.0.1:12321", channel_options); + sofa::pbrpc::RpcChannel rpc_channel(&g_rpc_client, "127.0.0.1:12321", channel_options); // Prepare parameters. sofa::pbrpc::RpcController* cntl = new sofa::pbrpc::RpcController(); diff --git a/src/sofa/pbrpc/rpc_byte_stream.h b/src/sofa/pbrpc/rpc_byte_stream.h index e775272..57c7fea 100644 --- a/src/sofa/pbrpc/rpc_byte_stream.h +++ b/src/sofa/pbrpc/rpc_byte_stream.h @@ -40,8 +40,8 @@ class RpcByteStream : public sofa::pbrpc::enable_shared_from_this , _remote_endpoint(endpoint) , _ticks(0) , _last_rw_ticks(0) - , _socket(io_service) , _status(STATUS_INIT) + , _socket(io_service) { SOFA_PBRPC_INC_RESOURCE_COUNTER(RpcByteStream); memset(_error_message, 0, sizeof(_error_message)); @@ -341,9 +341,6 @@ class RpcByteStream : public sofa::pbrpc::enable_shared_from_this volatile int64 _ticks; volatile int64 _last_rw_ticks; -private: - tcp::socket _socket; - enum { STATUS_INIT = 0, STATUS_CONNECTING = 1, @@ -351,6 +348,9 @@ class RpcByteStream : public sofa::pbrpc::enable_shared_from_this STATUS_CLOSED = 3, }; volatile int _status; + +private: + tcp::socket _socket; }; // class RpcByteStream } // namespace pbrpc diff --git a/src/sofa/pbrpc/rpc_message_stream.h b/src/sofa/pbrpc/rpc_message_stream.h index d7294e7..7432a2a 100644 --- a/src/sofa/pbrpc/rpc_message_stream.h +++ b/src/sofa/pbrpc/rpc_message_stream.h @@ -224,6 +224,8 @@ class RpcMessageStream : public RpcByteStream { SOFA_PBRPC_FUNCTION_TRACE; + if (_status != STATUS_CONNECTED) return; + if (error) { if (error != boost::asio::error::eof) @@ -286,6 +288,8 @@ class RpcMessageStream : public RpcByteStream { SOFA_PBRPC_FUNCTION_TRACE; + if (_status != STATUS_CONNECTED) return; + if (error) { #if defined( LOG ) diff --git a/src/sofa/pbrpc/rpc_server_message_stream.h b/src/sofa/pbrpc/rpc_server_message_stream.h index f135f83..1a1ec7b 100644 --- a/src/sofa/pbrpc/rpc_server_message_stream.h +++ b/src/sofa/pbrpc/rpc_server_message_stream.h @@ -223,6 +223,8 @@ class RpcServerMessageStream : public RpcByteStream { SOFA_PBRPC_FUNCTION_TRACE; + if (_status != STATUS_CONNECTED) return; + if (error) { if (error != boost::asio::error::eof) @@ -284,6 +286,8 @@ class RpcServerMessageStream : public RpcByteStream { SOFA_PBRPC_FUNCTION_TRACE; + if (_status != STATUS_CONNECTED) return; + if (error) { #if defined( LOG )