[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.