[network/libktorrent] src: API/ABI break: Store PeerConnector as unique_ptr

Jack Hill <[email protected]>
Newsgroups gmane.comp.kde.cvs
Message-ID <[email protected]>
Git commit d6dec56102cd26ba837fe6f5e5956170eaf97b0d by Jack Hill.
Committed on 01/08/2026 at 10:35.
Pushed by jackh into branch 'master'.

API/ABI break: Store PeerConnector as unique_ptr

The PeerConnector is already fully owned by the PeerManager. The
Authenticate object used to use a weak pointer to the PeerConnector, but
this is not neccessary as we stop the authentication in the
PeerConnector's d-ptr's destructor.

No downstream changes required.

M  +1    -1    src/mse/encryptedauthenticate.cpp
M  +1    -1    src/mse/encryptedauthenticate.h
M  +3    -5    src/peer/authenticate.cpp
M  +4    -3    src/peer/authenticate.h
M  +5    -11   src/peer/peerconnector.cpp
M  +0    -7    src/peer/peerconnector.h
M  +13   -8    src/peer/peermanager.cpp
M  +1    -1    src/peer/peermanager.h

https://invent.kde.org/network/libktorrent/-/commit/d6dec56102cd26ba837fe6f5e5956170eaf97b0d

diff --git a/src/mse/encryptedauthenticate.cpp b/src/mse/encryptedauthenticate.cpp
index fbc507e9..f40b59ea 100644
--- a/src/mse/encryptedauthenticate.cpp
+++ b/src/mse/encryptedauthenticate.cpp
@@ -27,7 +27,7 @@ EncryptedAuthenticate::EncryptedAuthenticate(const net::Address &addr,
                                              TransportProtocol proto,
                                              const SHA1Hash &info_hash,
                                              const PeerID &peer_id,
-                                             PeerConnector::WPtr pcon)
+                                             PeerConnector *pcon)
     : Authenticate(addr, proto, info_hash, peer_id, pcon)
 {
     mse::GeneratePublicPrivateKey(xa, ya);
diff --git a/src/mse/encryptedauthenticate.h b/src/mse/encryptedauthenticate.h
index cc5be806..a7219312 100644
--- a/src/mse/encryptedauthenticate.h
+++ b/src/mse/encryptedauthenticate.h
@@ -33,7 +33,7 @@ public:
                           bt::TransportProtocol proto,
                           const bt::SHA1Hash &info_hash,
                           const bt::PeerID &peer_id,
-                          bt::PeerConnector::WPtr pcon);
+                          bt::PeerConnector *pcon);
     ~EncryptedAuthenticate() override;
 
 private Q_SLOTS:
diff --git a/src/peer/authenticate.cpp b/src/peer/authenticate.cpp
index f87ed6a3..115d8ba6 100644
--- a/src/peer/authenticate.cpp
+++ b/src/peer/authenticate.cpp
@@ -8,12 +8,13 @@
 #include <mse/encryptedpacketsocket.h>
 #include <net/socks.h>
 #include <peer/accessmanager.h>
+#include <peer/peerconnector.h>
 #include <util/log.h>
 #include <utp/utpsocket.h>
 
 namespace bt
 {
-Authenticate::Authenticate(const net::Address &addr, TransportProtocol proto, const SHA1Hash &info_hash, const PeerID &peer_id, PeerConnector::WPtr pcon)
+Authenticate::Authenticate(const net::Address &addr, TransportProtocol proto, const SHA1Hash &info_hash, const PeerID &peer_id, PeerConnector *pcon)
     : info_hash(info_hash)
     , our_peer_id(peer_id)
     , addr(addr)
@@ -131,10 +132,7 @@ void Authenticate::onFinish(bool success)
     }
 
     timer.stop();
-    const PeerConnector::Ptr pc = pcon.toStrongRef();
-    if (pc) {
-        pc->authenticationFinished(this, success);
-    }
+    pcon->authenticationFinished(this, success);
 }
 
 void Authenticate::handshakeReceived(bool full)
diff --git a/src/peer/authenticate.h b/src/peer/authenticate.h
index 16a9103b..d1d3299a 100644
--- a/src/peer/authenticate.h
+++ b/src/peer/authenticate.h
@@ -7,7 +7,6 @@
 #define BTAUTHENTICATE_H
 
 #include "authenticatebase.h"
-#include <peer/peerconnector.h>
 #include <peer/peerid.h>
 #include <util/sha1hash.h>
 
@@ -18,6 +17,8 @@ class Socks;
 
 namespace bt
 {
+class PeerConnector;
+
 /*!
  * \headerfile peer/authenticate.h
  * \author Joris Guisson
@@ -35,7 +36,7 @@ public:
      * \param peer_id Peer ID
      * \param pcon PeerConnector
      */
-    Authenticate(const net::Address &addr, TransportProtocol proto, const SHA1Hash &info_hash, const PeerID &peer_id, PeerConnector::WPtr pcon);
+    Authenticate(const net::Address &addr, TransportProtocol proto, const SHA1Hash &info_hash, const PeerID &peer_id, PeerConnector *pcon);
 
     ~Authenticate() override;
 
@@ -68,7 +69,7 @@ protected:
     PeerID our_peer_id, peer_id;
     net::Address addr;
     bool success;
-    PeerConnector::WPtr pcon;
+    PeerConnector *pcon;
     std::unique_ptr<net::Socks> socks;
 };
 }
diff --git a/src/peer/peerconnector.cpp b/src/peer/peerconnector.cpp
index c26dbe23..1ea328de 100644
--- a/src/peer/peerconnector.cpp
+++ b/src/peer/peerconnector.cpp
@@ -54,7 +54,6 @@ public:
     QPointer<Authenticate> auth;
     bool stopping;
     bool do_not_start;
-    PeerConnector::WPtr self;
     std::unique_ptr<ConnectionLimit::Token> token;
 };
 
@@ -68,11 +67,6 @@ PeerConnector::~PeerConnector()
 {
 }
 
-void PeerConnector::setWeakPointer(PeerConnector::WPtr ptr)
-{
-    d->self = ptr;
-}
-
 void PeerConnector::setMaxActive(Uint32 mc)
 {
     half_open_connections.setMaxActive(mc);
@@ -128,7 +122,7 @@ void PeerConnector::Private::authenticationFinished(Authenticate *auth, bool ok)
     }
 
     if (ok) {
-        pm->peerAuthenticated(auth, self, ok, std::move(token));
+        pm->peerAuthenticated(auth, p, ok, std::move(token));
         return;
     }
 
@@ -153,7 +147,7 @@ void PeerConnector::Private::authenticationFinished(Authenticate *auth, bool ok)
         } else if (!only_use_utp && !only_use_encryption && !tried_methods.contains(TCP_WITHOUT_ENCRYPTION) && tcp_allowed) {
             start(TCP_WITHOUT_ENCRYPTION);
         } else {
-            pm->peerAuthenticated(auth, self, false, std::move(token));
+            pm->peerAuthenticated(auth, p, false, std::move(token));
         }
     } else { // Primary is TCP
         if (!only_use_utp && encryption && !tried_methods.contains(TCP_WITH_ENCRYPTION) && tcp_allowed) {
@@ -165,7 +159,7 @@ void PeerConnector::Private::authenticationFinished(Authenticate *auth, bool ok)
         } else if (utp && !only_use_encryption && !tried_methods.contains(UTP_WITHOUT_ENCRYPTION)) {
             start(UTP_WITHOUT_ENCRYPTION);
         } else {
-            pm->peerAuthenticated(auth, self, false, std::move(token));
+            pm->peerAuthenticated(auth, p, false, std::move(token));
         }
     }
 }
@@ -181,9 +175,9 @@ void PeerConnector::Private::start(PeerConnector::Method method)
     const Torrent &tor = pm->getTorrent();
     const TransportProtocol proto = (method == TCP_WITH_ENCRYPTION || method == TCP_WITHOUT_ENCRYPTION) ? TCP : UTP;
     if (method == TCP_WITH_ENCRYPTION || method == UTP_WITH_ENCRYPTION) {
-        auth = new mse::EncryptedAuthenticate(addr, proto, tor.getInfoHash(), tor.getPeerID(), self);
+        auth = new mse::EncryptedAuthenticate(addr, proto, tor.getInfoHash(), tor.getPeerID(), p);
     } else {
-        auth = new Authenticate(addr, proto, tor.getInfoHash(), tor.getPeerID(), self);
+        auth = new Authenticate(addr, proto, tor.getInfoHash(), tor.getPeerID(), p);
     }
 
     if (local) {
diff --git a/src/peer/peerconnector.h b/src/peer/peerconnector.h
index f90f57e2..e0d253b7 100644
--- a/src/peer/peerconnector.h
+++ b/src/peer/peerconnector.h
@@ -8,7 +8,6 @@
 #define BT_PEERCONNECTOR_H
 
 #include "connectionlimit.h"
-#include <QSharedPointer>
 #include <ktorrent_export.h>
 #include <net/address.h>
 #include <util/constants.h>
@@ -42,12 +41,6 @@ public:
      */
     static void setMaxActive(Uint32 mc);
 
-    using Ptr = QSharedPointer<PeerConnector>;
-    using WPtr = QWeakPointer<PeerConnector>;
-
-    //! Set a weak pointer to this object
-    void setWeakPointer(WPtr ptr);
-
 private:
     void acquired() override;
 
diff --git a/src/peer/peermanager.cpp b/src/peer/peermanager.cpp
index ce69522a..faa0bca6 100644
--- a/src/peer/peermanager.cpp
+++ b/src/peer/peermanager.cpp
@@ -5,6 +5,9 @@
 */
 #include "peermanager.h"
 
+#include <memory>
+#include <vector>
+
 #include <KLocalizedString>
 #include <QDateTime>
 #include <QFile>
@@ -74,7 +77,7 @@ public:
     bool wanted_changed;
     PieceHandler *piece_handler;
     bool paused;
-    QSet<PeerConnector::Ptr> connectors;
+    std::vector<std::unique_ptr<PeerConnector>> connectors;
     QScopedPointer<SuperSeeder> superseeder;
     std::map<net::Address, bool> potential_peers;
     bool partial_seed;
@@ -218,7 +221,7 @@ void PeerManager::newConnection(std::unique_ptr<mse::EncryptedPacketSocket> sock
     }
 }
 
-void PeerManager::peerAuthenticated(bt::Authenticate *auth, bt::PeerConnector::WPtr pcon, bool ok, std::unique_ptr<ConnectionLimit::Token> token)
+void PeerManager::peerAuthenticated(bt::Authenticate *auth, bt::PeerConnector *pcon, bool ok, std::unique_ptr<ConnectionLimit::Token> token)
 {
     if (d->started) {
         if (ok && !connectedTo(auth->getPeerID())) {
@@ -226,8 +229,12 @@ void PeerManager::peerAuthenticated(bt::Authenticate *auth, bt::PeerConnector::W
         }
     }
 
-    const PeerConnector::Ptr ptr = pcon.toStrongRef();
-    d->connectors.remove(ptr);
+    const auto it = std::find_if(d->connectors.cbegin(), d->connectors.cend(), [pcon](const std::unique_ptr<bt::PeerConnector> &pc) {
+        return pc.get() == pcon;
+    });
+    if (it != d->connectors.cend()) {
+        d->connectors.erase(it);
+    }
 }
 
 bool PeerManager::connectedTo(const PeerID &peer_id)
@@ -726,10 +733,8 @@ void PeerManager::Private::connectToPeers()
                 break;
             }
 
-            const PeerConnector::Ptr pcon(new PeerConnector(itr->first, itr->second, p, std::move(token)));
-            pcon->setWeakPointer(PeerConnector::WPtr(pcon));
-            connectors.insert(pcon);
-            pcon->start();
+            connectors.emplace_back(std::make_unique<PeerConnector>(itr->first, itr->second, p, std::move(token)));
+            connectors.back()->start();
         }
 
         potential_peers.erase(itr);
diff --git a/src/peer/peermanager.h b/src/peer/peermanager.h
index 38d60f8e..efc98914 100644
--- a/src/peer/peermanager.h
+++ b/src/peer/peermanager.h
@@ -187,7 +187,7 @@ public:
      * \param ok Whether or not the attempt was successful
      * \param token The ConnectionLimit::Token
      */
-    void peerAuthenticated(Authenticate *auth, PeerConnector::WPtr pcon, bool ok, std::unique_ptr<ConnectionLimit::Token> token);
+    void peerAuthenticated(Authenticate *auth, PeerConnector *pcon, bool ok, std::unique_ptr<ConnectionLimit::Token> token);
 
     /*!
      * Save the IP's and port numbers of all peers.
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.