@@ -325,9 +325,8 @@ bool StreamConnectionContainer::createSocket(const IStreamConnectionPtr& streamC
325325 SocketDescriptorPtr sd = socket->getSocketDescriptor ();
326326 assert (sd);
327327 connectionData.sd = sd->getDescriptor ();
328- AddressHelpers::addr2peer (reinterpret_cast <sockaddr*>(const_cast <char *>(connectionData.sockaddr .c_str ())), connectionData);
329328
330- IStreamConnectionPrivatePtr streamConnectionPrivate;
329+ IStreamConnectionPrivatePtr streamConnectionPrivate;
331330 std::unique_lock<std::mutex> lock (m_mutex);
332331 auto it = m_connectionId2Connection.find (connectionData.connectionId );
333332 if (it != m_connectionId2Connection.end ())
@@ -336,7 +335,9 @@ bool StreamConnectionContainer::createSocket(const IStreamConnectionPtr& streamC
336335 assert (streamConnectionPrivate);
337336 streamConnectionPrivate->setSocket (socket);
338337 streamConnectionPrivate->updateConnectionData (connectionData);
339- m_sd2Connection[connectionData.sd ] = it->second ;
338+ auto & entry = m_sd2Connection[connectionData.sd ];
339+ assert (entry == nullptr );
340+ entry = it->second ;
340341 m_connectionsStable.clear (std::memory_order_release);
341342 }
342343 else
@@ -399,6 +400,7 @@ bool StreamConnectionContainer::connect(const std::string& endpoint, const IStre
399400 addrTcp.sin_addr .s_addr = ipAddress.s_addr ;
400401 addrTcp.sin_port = htons (static_cast <std::int16_t >(connectionData.port ));
401402 connectionData.sockaddr = std::string (reinterpret_cast <const char *>(&addrTcp), sizeof (sockaddr_in));
403+ AddressHelpers::addr2peer (reinterpret_cast <sockaddr*>(const_cast <char *>(connectionData.sockaddr .c_str ())), connectionData);
402404 IStreamConnectionPrivatePtr streamConnectionPrivate;
403405 std::unique_lock<std::mutex> lock (m_mutex);
404406 auto it = m_connectionId2Connection.find (connectionData.connectionId );
@@ -427,6 +429,7 @@ bool StreamConnectionContainer::connect(const std::string& endpoint, const IStre
427429 else
428430 {
429431 connectionData.sockaddr = addr;
432+ AddressHelpers::addr2peer (reinterpret_cast <sockaddr*>(const_cast <char *>(connectionData.sockaddr .c_str ())), connectionData);
430433 IStreamConnectionPrivatePtr streamConnectionPrivate;
431434 std::unique_lock<std::mutex> lock (m_mutex);
432435 auto it = m_connectionId2Connection.find (connectionData.connectionId );
@@ -486,24 +489,24 @@ IStreamConnectionPtr StreamConnectionContainer::getConnection(std::int64_t conne
486489
487490// ////////////
488491
489- void StreamConnectionContainer::removeConnection (const SocketDescriptorPtr& sd, std:: int64_t connectionId )
492+ void StreamConnectionContainer::disconnectIntern (const IStreamConnectionPrivatePtr& connectionDisconnect, const SocketDescriptorPtr& sd )
490493{
494+ bool removeConn = connectionDisconnect->changeStateForDisconnect ();
495+ m_poller->removeSocket (sd);
491496 std::unique_lock<std::mutex> lock (m_mutex);
492497 if (sd)
493498 {
499+ m_socketErase.push_back (sd);
494500 m_sd2Connection.erase (sd->getDescriptor ());
495501 m_connectionsStable.clear (std::memory_order_release);
496502 }
497- m_connectionId2Connection.erase (connectionId);
503+ if (removeConn)
504+ {
505+ m_connectionId2Connection.erase (connectionDisconnect->getConnectionId ());
506+ }
498507 lock.unlock ();
499- }
500-
501- void StreamConnectionContainer::disconnectIntern (const IStreamConnectionPrivatePtr& connectionDisconnect, const SocketDescriptorPtr& sd)
502- {
503- bool removeConn = connectionDisconnect->changeStateForDisconnect ();
504508 if (removeConn)
505509 {
506- removeConnection (sd, connectionDisconnect->getConnectionId ());
507510 connectionDisconnect->disconnected (connectionDisconnect);
508511 }
509512}
@@ -839,12 +842,20 @@ void StreamConnectionContainer::pollerLoop()
839842 m_lastReconnectTime = std::chrono::steady_clock::now ();
840843 while (!m_terminatePollerLoop)
841844 {
845+ if (m_connectionsStable.test_and_set (std::memory_order_acq_rel))
846+ {
847+ std::unique_lock<std::mutex> lock (m_mutex);
848+ m_sd2ConnectionPollerLoop = m_sd2Connection;
849+ m_socketErase.clear ();
850+ }
851+
842852 const PollerResult& result = m_poller->wait (1000 );
843853
844854 if (m_connectionsStable.test_and_set (std::memory_order_acq_rel))
845855 {
846856 std::unique_lock<std::mutex> lock (m_mutex);
847857 m_sd2ConnectionPollerLoop = m_sd2Connection;
858+ m_socketErase.clear ();
848859 }
849860
850861 if (result.releaseWait )
@@ -905,6 +916,7 @@ void StreamConnectionContainer::pollerLoop()
905916 SocketPtr socket = connection->getSocketPrivate ();
906917 if (socket)
907918 {
919+ assert (info.sd == socket->getSocketDescriptor ()->getDescriptor ());
908920 handleConnectionEvents (connection, socket, info);
909921 }
910922 }
0 commit comments