2727namespace trpc {
2828
2929FiberConnectorGroupManager::FiberConnectorGroupManager (TransInfo&& trans_info) : trans_info_(std::move(trans_info)) {
30- tcp_impl_.store (std::make_unique<TcpImpl>().release ());
3130 udp_impl_.store (std::make_unique<UdpImpl>().release ());
3231
33- fiber_transport_state_.store (ClientTransportState::kInitialized , std::memory_order_release );
32+ fiber_transport_state_.store (ClientTransportState::kInitialized );
3433}
3534
3635FiberConnectorGroupManager::~FiberConnectorGroupManager () { Stop (); }
3736
3837void FiberConnectorGroupManager::Stop () {
39- std::scoped_lock _ (mutex_) ;
40-
41- if (fiber_transport_state_.load (std::memory_order_acquire) != ClientTransportState:: kInitialized ) {
38+ ClientTransportState old_value = ClientTransportState:: kInitialized ;
39+ ClientTransportState new_value = ClientTransportState:: kStopped ;
40+ if (! fiber_transport_state_.compare_exchange_strong (old_value, new_value) ) {
4241 return ;
4342 }
4443
4544 {
46- Hazptr hazptr;
47- auto tcp_impl = hazptr.Keep (&tcp_impl_);
48- if (tcp_impl) {
49- for (auto && [name, group] : tcp_impl->tcp_connector_groups ) {
50- (void )name;
51- group->Stop ();
52- }
53- }
45+ std::unique_lock lock (tcp_mutex_);
46+ tcp_connector_groups_.swap (tcp_connector_groups_to_destroy_);
47+ }
48+
49+ for (auto & group : tcp_connector_groups_to_destroy_) {
50+ group.second ->Stop ();
5451 }
5552
5653 {
54+ std::scoped_lock _ (udp_mutex_);
5755 Hazptr hazptr;
5856 auto udp_impl = hazptr.Keep (&udp_impl_);
5957 if (udp_impl) {
@@ -66,47 +64,45 @@ void FiberConnectorGroupManager::Stop() {
6664 }
6765 }
6866 }
69-
70- fiber_transport_state_.store (ClientTransportState::kStopped , std::memory_order_release);
7167}
7268
7369void FiberConnectorGroupManager::Destroy () {
74- std::scoped_lock _ (mutex_) ;
75-
76- if (fiber_transport_state_.load (std::memory_order_acquire) != ClientTransportState:: kStopped ) {
70+ ClientTransportState old_value = ClientTransportState:: kStopped ;
71+ ClientTransportState new_value = ClientTransportState:: kDestroyed ;
72+ if (! fiber_transport_state_.compare_exchange_strong (old_value, new_value) ) {
7773 return ;
7874 }
7975
80- auto tcp_impl = tcp_impl_.exchange (nullptr , std::memory_order_relaxed);
81- if (tcp_impl) {
82- for (auto && [name, group] : tcp_impl->tcp_connector_groups ) {
83- (void )name;
84- group->Destroy ();
85- delete group;
86- group = nullptr ;
87- }
76+ std::unordered_map<std::string, FiberConnectorGroup*> tmp_tcp;
77+ {
78+ std::unique_lock lock (tcp_mutex_);
79+ tcp_connector_groups_to_destroy_.swap (tmp_tcp);
80+ }
8881
89- tcp_impl->tcp_connector_groups .clear ();
90- tcp_impl->Retire ();
82+ for (auto & group : tmp_tcp) {
83+ group.second ->Destroy ();
84+ delete group.second ;
85+ group.second = nullptr ;
9186 }
9287
93- auto udp_impl = udp_impl_.exchange (nullptr , std::memory_order_relaxed);
94- if (udp_impl) {
95- if (udp_impl->udp_connector_groups [0 ] != nullptr ) {
96- udp_impl->udp_connector_groups [0 ]->Destroy ();
97- delete udp_impl->udp_connector_groups [0 ];
98- udp_impl->udp_connector_groups [0 ] = nullptr ;
99- }
88+ {
89+ std::scoped_lock _ (udp_mutex_);
90+ auto udp_impl = udp_impl_.exchange (nullptr , std::memory_order_relaxed);
91+ if (udp_impl) {
92+ if (udp_impl->udp_connector_groups [0 ] != nullptr ) {
93+ udp_impl->udp_connector_groups [0 ]->Destroy ();
94+ delete udp_impl->udp_connector_groups [0 ];
95+ udp_impl->udp_connector_groups [0 ] = nullptr ;
96+ }
10097
101- if (udp_impl->udp_connector_groups [1 ] != nullptr ) {
102- udp_impl->udp_connector_groups [1 ]->Destroy ();
103- delete udp_impl->udp_connector_groups [1 ];
104- udp_impl->udp_connector_groups [1 ] = nullptr ;
98+ if (udp_impl->udp_connector_groups [1 ] != nullptr ) {
99+ udp_impl->udp_connector_groups [1 ]->Destroy ();
100+ delete udp_impl->udp_connector_groups [1 ];
101+ udp_impl->udp_connector_groups [1 ] = nullptr ;
102+ }
103+ udp_impl->Retire ();
105104 }
106- udp_impl->Retire ();
107105 }
108-
109- fiber_transport_state_.store (ClientTransportState::kDestroyed , std::memory_order_release);
110106}
111107
112108FiberConnectorGroup* FiberConnectorGroupManager::Get (const NodeAddr& node_addr) {
@@ -123,40 +119,29 @@ FiberConnectorGroup* FiberConnectorGroupManager::GetFromTcpGroup(const NodeAddr&
123119 snprintf (const_cast <char *>(endpoint.c_str ()), len, " %s:%d" , node_addr.ip .c_str (), node_addr.port );
124120
125121 {
126- Hazptr hazptr;
127- auto ptr = hazptr.Keep (&tcp_impl_);
128- auto it = ptr->tcp_connector_groups .find (endpoint);
129- if (it != ptr->tcp_connector_groups .end ()) {
122+ std::shared_lock lock (tcp_mutex_);
123+ auto it = tcp_connector_groups_.find (endpoint);
124+ if (it != tcp_connector_groups_.end ()) {
130125 return it->second ;
131126 }
132127 }
133128
134- FiberConnectorGroup* pool{nullptr };
129+ if (TRPC_UNLIKELY (fiber_transport_state_.load (std::memory_order_relaxed) != ClientTransportState::kInitialized )) {
130+ return nullptr ;
131+ }
135132
136133 {
137- auto new_tcp_impl = std::make_unique<TcpImpl>();
138-
139- std::scoped_lock _ (mutex_);
140-
141- {
142- Hazptr hazptr;
143- auto ptr = hazptr.Keep (&tcp_impl_);
144- auto it = ptr->tcp_connector_groups .find (endpoint);
145- if (it != ptr->tcp_connector_groups .end ()) {
146- return it->second ;
147- } else {
148- new_tcp_impl->tcp_connector_groups = ptr->tcp_connector_groups ;
149- }
134+ std::unique_lock lock (tcp_mutex_);
135+ auto it = tcp_connector_groups_.find (endpoint);
136+ if (it != tcp_connector_groups_.end ()) {
137+ return it->second ;
150138 }
151139
152- pool = CreateTcpConnectorGroup (node_addr);
140+ FiberConnectorGroup* pool = CreateTcpConnectorGroup (node_addr);
141+ tcp_connector_groups_.emplace (std::move (endpoint), pool);
153142
154- new_tcp_impl->tcp_connector_groups .emplace (std::move (endpoint), pool);
155-
156- tcp_impl_.exchange (new_tcp_impl.release (), std::memory_order_acq_rel)->Retire ();
143+ return pool;
157144 }
158-
159- return pool;
160145}
161146
162147FiberConnectorGroup* FiberConnectorGroupManager::GetFromUdpGroup (const NodeAddr& node_addr) {
@@ -176,7 +161,7 @@ FiberConnectorGroup* FiberConnectorGroupManager::GetFromUdpGroup(const NodeAddr&
176161 {
177162 auto new_udp_impl = std::make_unique<UdpImpl>();
178163
179- std::scoped_lock _ (mutex_ );
164+ std::scoped_lock _ (udp_mutex_ );
180165 {
181166 Hazptr hazptr;
182167 auto old_udp_impl = hazptr.Keep (&udp_impl_);
0 commit comments