Эх сурвалжийг харах

channel server增加is_stopped字段,主动stop时防止两次stop

tanghai 14 жил өмнө
parent
commit
35c12f5022

+ 5 - 0
Cpp/Platform/Rpc/RpcChannel.cc

@@ -58,6 +58,11 @@ void RpcChannel::OnSendMessage(RpcMetaPtr meta, StringPtr message)
 
 void RpcChannel::Stop()
 {
+	if (is_stopped)
+	{
+		return;
+	}
+	is_stopped = true;
 	socket.close();
 }
 

+ 1 - 0
Cpp/Platform/Rpc/RpcChannel.h

@@ -22,6 +22,7 @@ private:
 
 	std::size_t id;
 	RequestHandlerMap request_handlers;
+	bool is_stopped;
 
 	void OnAsyncConnect(const boost::system::error_code& err);
 

+ 3 - 0
Cpp/Platform/Rpc/RpcServerTest.cc

@@ -85,8 +85,11 @@ TEST_F(RpcServerTest, ChannelAndServer)
 			google::protobuf::NewCallback(&barrier, &CountBarrier::Signal));
 	barrier.Wait();
 
+	// 加入到io线程
 	io_client.post(boost::bind(&RpcChannel::Stop, channel));
 	io_server.post(boost::bind(&RpcServer::Stop, server));
+
+	// 加入任务队列,等channel和server stop,io_service才stop
 	io_client.post(boost::bind(&boost::asio::io_service::stop, &io_client));
 	io_server.post(boost::bind(&boost::asio::io_service::stop, &io_server));
 

+ 6 - 1
Cpp/Platform/Rpc/RpcSession.cc

@@ -6,7 +6,7 @@
 namespace Egametang {
 
 RpcSession::RpcSession(boost::asio::io_service& io_service, RpcServer& server):
-		RpcCommunicator(io_service), rpc_server(server)
+		RpcCommunicator(io_service), rpc_server(server), is_stopped(false)
 {
 }
 
@@ -38,6 +38,11 @@ void RpcSession::Start()
 
 void RpcSession::Stop()
 {
+	if (is_stopped)
+	{
+		return;
+	}
+	is_stopped = true;
 	RpcSessionPtr session = shared_from_this();
 	rpc_server.Remove(session);
 }

+ 1 - 0
Cpp/Platform/Rpc/RpcSession.h

@@ -15,6 +15,7 @@ class RpcSession: public RpcCommunicator, public boost::enable_shared_from_this<
 {
 private:
 	RpcServer& rpc_server;
+	bool is_stopped;
 
 	virtual void OnRecvMessage(RpcMetaPtr meta, StringPtr message);
 	virtual void OnSendMessage(RpcMetaPtr meta, StringPtr message);

+ 1 - 1
Cpp/Platform/Thread/CountBarrierTest.cc

@@ -30,7 +30,7 @@ public:
 	{
 		boost::xtime xt;
 		boost::xtime_get(&xt, boost::TIME_UTC);
-		xt.sec += 2;
+		xt.sec += 1;
 		boost::thread::sleep(xt);
 		++count;
 		barrier.Signal();