Skip to content

Commit f8055a6

Browse files
committed
fast release memory on ConnectTestHttps to smaller memory footprints
1 parent 537de56 commit f8055a6

3 files changed

Lines changed: 34 additions & 4 deletions

File tree

src/ConnectTestHttps.cpp

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ ConnectTestHttpsSession::ConnectTestHttpsSession(
3232
const std::string &targetHost, uint16_t targetPort, const std::string &targetPath, int httpVersion,
3333
const std::string &socks5Host, const std::string &socks5Port,
3434
const std::string &socks5AuthUser, const std::string &socks5AuthPwd,
35+
const std::weak_ptr<ConnectTestHttps> &parent,
3536
bool slowImpl, std::chrono::milliseconds delayTime) :
3637
executor(executor),
3738
resolver_(executor),
@@ -44,6 +45,7 @@ ConnectTestHttpsSession::ConnectTestHttpsSession(
4445
socks5Port(socks5Port),
4546
socks5AuthUser(socks5AuthUser),
4647
socks5AuthPwd(socks5AuthPwd),
48+
parent(parent),
4749
slowImpl(slowImpl),
4850
delayTime(delayTime) {
4951
// std::cout << "ConnectTestHttpsSession :" << socks5Host << ":" << socks5Port << std::endl;
@@ -85,6 +87,13 @@ void ConnectTestHttpsSession::run(
8587

8688
void ConnectTestHttpsSession::release() {
8789
callback.reset();
90+
auto ptr = parent.lock();
91+
if (ptr) {
92+
ptr->releaseConnectTestHttpsSession(shared_from_this());
93+
ptr.reset();
94+
} else {
95+
BOOST_LOG_S5B(warning) << "ConnectTestHttpsSession::release() parent is nullptr";
96+
}
8897
_isComplete = true;
8998
}
9099

@@ -723,12 +732,13 @@ ConnectTestHttps::createTest(
723732
socks5Port,
724733
socks5AuthUser,
725734
socks5AuthPwd,
735+
shared_from_this(),
726736
slowImpl,
727737
std::chrono::milliseconds{
728738
maxRandomDelay.count() > 0 ? getRandom<long long int>(0, maxRandomDelay.count()) : 0
729739
}
730740
);
731-
sessions.push_back(s->shared_from_this());
741+
sessions.insert(s->shared_from_this());
732742
// sessions.front().lock();
733743
return s;
734744
}
@@ -737,9 +747,13 @@ void ConnectTestHttps::do_cleanTimer() {
737747
auto c = [this, self = shared_from_this(), cleanTimer = this->cleanTimer]
738748
(const boost::system::error_code &e) {
739749
if (e) {
750+
BOOST_LOG_S5B(error) << "ConnectTestHttps::do_cleanTimer() c error_code " << e;
751+
boost::system::error_code ec;
752+
this->cleanTimer->cancel(ec);
753+
this->cleanTimer.reset();
740754
return;
741755
}
742-
// std::cout << "do_cleanTimer()" << std::endl;
756+
BOOST_LOG_S5B(trace) << "ConnectTestHttps::do_cleanTimer()";
743757

744758
auto it = sessions.begin();
745759
while (it != sessions.end()) {
@@ -776,3 +790,11 @@ void ConnectTestHttps::stop() {
776790
}
777791
}
778792
}
793+
794+
void ConnectTestHttps::releaseConnectTestHttpsSession(const std::shared_ptr<ConnectTestHttpsSession> &ptr) {
795+
if (sessions.contains(ptr)) {
796+
sessions.erase(ptr);
797+
} else {
798+
BOOST_LOG_S5B(warning) << "ConnectTestHttps::releaseConnectTestHttpsSession() session not found in sessions list. double free ?";
799+
}
800+
}

src/ConnectTestHttps.h

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
#include <string>
3737
#include <sstream>
3838
#include <list>
39+
#include <set>
3940
#include <vector>
4041
#include <functional>
4142
#include <openssl/opensslv.h>
@@ -49,6 +50,8 @@
4950

5051
#endif // _WIN32
5152

53+
class ConnectTestHttps;
54+
5255
class ConnectTestHttpsSession : public std::enable_shared_from_this<ConnectTestHttpsSession> {
5356
boost::asio::any_io_executor executor;
5457

@@ -69,6 +72,8 @@ class ConnectTestHttpsSession : public std::enable_shared_from_this<ConnectTestH
6972
const std::string socks5AuthPwd;
7073
bool slowImpl;
7174

75+
std::weak_ptr<ConnectTestHttps> parent;
76+
7277
std::chrono::milliseconds delayTime;
7378

7479
enum {
@@ -92,6 +97,7 @@ class ConnectTestHttpsSession : public std::enable_shared_from_this<ConnectTestH
9297
const std::string &socks5Port,
9398
const std::string &socks5AuthUser,
9499
const std::string &socks5AuthPwd,
100+
const std::weak_ptr<ConnectTestHttps> &parent,
95101
bool slowImpl,
96102
std::chrono::milliseconds delayTime = std::chrono::milliseconds{0}
97103
);
@@ -154,7 +160,7 @@ class ConnectTestHttps : public std::enable_shared_from_this<ConnectTestHttps> {
154160
boost::asio::any_io_executor executor;
155161
std::shared_ptr<boost::asio::ssl::context> ssl_context;
156162
bool need_verify_ssl = true;
157-
std::list<std::shared_ptr<ConnectTestHttpsSession>> sessions;
163+
std::set<std::shared_ptr<ConnectTestHttpsSession>> sessions;
158164

159165
std::shared_ptr<boost::asio::steady_timer> cleanTimer;
160166
public:
@@ -175,6 +181,8 @@ class ConnectTestHttps : public std::enable_shared_from_this<ConnectTestHttps> {
175181

176182
void stop();
177183

184+
void releaseConnectTestHttpsSession(const std::shared_ptr<ConnectTestHttpsSession> &ptr);
185+
178186
private:
179187
void do_cleanTimer();
180188
};

src/TcpTest.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@ void TcpTest::do_cleanTimer() {
146146
BOOST_LOG_S5B(error) << "TcpTest::do_cleanTimer() c error_code " << e;
147147
boost::system::error_code ec;
148148
this->cleanTimer->cancel(ec);
149-
this->cleanTimer = nullptr;
149+
this->cleanTimer.reset();
150150
return;
151151
}
152152
BOOST_LOG_S5B(trace) << "TcpTest::do_cleanTimer()";

0 commit comments

Comments
 (0)