From 983627c88d99205241adae882a160c3b7f483ed6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20M=C3=B6ller?= Date: Tue, 9 Feb 2021 15:12:28 +0100 Subject: [PATCH] Update VirtualSocketServer to use more std::unique_ptr And delete RecursiveCriticalSection delay_crit_. Bug: webrtc:11567 Change-Id: I70826fba3806e5d7525d6288be3d83eb43cc5fe6 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/206469 Reviewed-by: Tommi Reviewed-by: Harald Alvestrand Commit-Queue: Niels Moller Cr-Commit-Position: refs/heads/master@{#33228} --- rtc_base/virtual_socket_server.cc | 45 ++++++++++++++--------------- rtc_base/virtual_socket_server.h | 25 +++++++--------- rtc_base/virtual_socket_unittest.cc | 5 ++-- 3 files changed, 34 insertions(+), 41 deletions(-) diff --git a/rtc_base/virtual_socket_server.cc b/rtc_base/virtual_socket_server.cc index 804dc75624..708ee14894 100644 --- a/rtc_base/virtual_socket_server.cc +++ b/rtc_base/virtual_socket_server.cc @@ -1019,13 +1019,7 @@ void PrintFunction(std::vector >* f) { #endif // void VirtualSocketServer::UpdateDelayDistribution() { - Function* dist = - CreateDistribution(delay_mean_, delay_stddev_, delay_samples_); - // We take a lock just to make sure we don't leak memory. - { - CritScope cs(&delay_crit_); - delay_dist_.reset(dist); - } + delay_dist_ = CreateDistribution(delay_mean_, delay_stddev_, delay_samples_); } static double PI = 4 * atan(1.0); @@ -1044,11 +1038,11 @@ static double Pareto(double x, double min, double k) { } #endif -VirtualSocketServer::Function* VirtualSocketServer::CreateDistribution( - uint32_t mean, - uint32_t stddev, - uint32_t samples) { - Function* f = new Function(); +std::unique_ptr +VirtualSocketServer::CreateDistribution(uint32_t mean, + uint32_t stddev, + uint32_t samples) { + auto f = std::make_unique(); if (0 == stddev) { f->push_back(Point(mean, 1.0)); @@ -1064,7 +1058,7 @@ VirtualSocketServer::Function* VirtualSocketServer::CreateDistribution( f->push_back(Point(x, y)); } } - return Resample(Invert(Accumulate(f)), 0, 1, samples); + return Resample(Invert(Accumulate(std::move(f))), 0, 1, samples); } uint32_t VirtualSocketServer::GetTransitDelay(Socket* socket) { @@ -1093,7 +1087,8 @@ struct FunctionDomainCmp { } }; -VirtualSocketServer::Function* VirtualSocketServer::Accumulate(Function* f) { +std::unique_ptr VirtualSocketServer::Accumulate( + std::unique_ptr f) { RTC_DCHECK(f->size() >= 1); double v = 0; for (Function::size_type i = 0; i < f->size() - 1; ++i) { @@ -1106,7 +1101,8 @@ VirtualSocketServer::Function* VirtualSocketServer::Accumulate(Function* f) { return f; } -VirtualSocketServer::Function* VirtualSocketServer::Invert(Function* f) { +std::unique_ptr VirtualSocketServer::Invert( + std::unique_ptr f) { for (Function::size_type i = 0; i < f->size(); ++i) std::swap((*f)[i].first, (*f)[i].second); @@ -1114,24 +1110,25 @@ VirtualSocketServer::Function* VirtualSocketServer::Invert(Function* f) { return f; } -VirtualSocketServer::Function* VirtualSocketServer::Resample(Function* f, - double x1, - double x2, - uint32_t samples) { - Function* g = new Function(); +std::unique_ptr VirtualSocketServer::Resample( + std::unique_ptr f, + double x1, + double x2, + uint32_t samples) { + auto g = std::make_unique(); for (size_t i = 0; i < samples; i++) { double x = x1 + (x2 - x1) * i / (samples - 1); - double y = Evaluate(f, x); + double y = Evaluate(f.get(), x); g->push_back(Point(x, y)); } - delete f; return g; } -double VirtualSocketServer::Evaluate(Function* f, double x) { - Function::iterator iter = absl::c_lower_bound(*f, x, FunctionDomainCmp()); +double VirtualSocketServer::Evaluate(const Function* f, double x) { + Function::const_iterator iter = + absl::c_lower_bound(*f, x, FunctionDomainCmp()); if (iter == f->begin()) { return (*f)[0].second; } else if (iter == f->end()) { diff --git a/rtc_base/virtual_socket_server.h b/rtc_base/virtual_socket_server.h index 84f8fb1bdc..cb60f805a8 100644 --- a/rtc_base/virtual_socket_server.h +++ b/rtc_base/virtual_socket_server.h @@ -130,9 +130,9 @@ class VirtualSocketServer : public SocketServer, public sigslot::has_slots<> { typedef std::pair Point; typedef std::vector Function; - static Function* CreateDistribution(uint32_t mean, - uint32_t stddev, - uint32_t samples); + static std::unique_ptr CreateDistribution(uint32_t mean, + uint32_t stddev, + uint32_t samples); // Similar to Thread::ProcessMessages, but it only processes messages until // there are no immediate messages or pending network traffic. Returns false @@ -221,15 +221,14 @@ class VirtualSocketServer : public SocketServer, public sigslot::has_slots<> { // appropriate distribution. uint32_t GetTransitDelay(Socket* socket); - // Basic operations on functions. Those that return a function also take - // ownership of the function given (and hence, may modify or delete it). - static Function* Accumulate(Function* f); - static Function* Invert(Function* f); - static Function* Resample(Function* f, - double x1, - double x2, - uint32_t samples); - static double Evaluate(Function* f, double x); + // Basic operations on functions. + static std::unique_ptr Accumulate(std::unique_ptr f); + static std::unique_ptr Invert(std::unique_ptr f); + static std::unique_ptr Resample(std::unique_ptr f, + double x1, + double x2, + uint32_t samples); + static double Evaluate(const Function* f, double x); // Null out our message queue if it goes away. Necessary in the case where // our lifetime is greater than that of the thread we are using, since we @@ -295,8 +294,6 @@ class VirtualSocketServer : public SocketServer, public sigslot::has_slots<> { std::map alternative_address_mapping_; std::unique_ptr delay_dist_; - RecursiveCriticalSection delay_crit_; - double drop_prob_; bool sending_blocked_ = false; RTC_DISALLOW_COPY_AND_ASSIGN(VirtualSocketServer); diff --git a/rtc_base/virtual_socket_unittest.cc b/rtc_base/virtual_socket_unittest.cc index 78003f5cb2..96a359d187 100644 --- a/rtc_base/virtual_socket_unittest.cc +++ b/rtc_base/virtual_socket_unittest.cc @@ -1117,10 +1117,10 @@ TEST_F(VirtualSocketServerTest, CreatesStandardDistribution) { ASSERT_LT(0u, kTestSamples[sidx]); const uint32_t kStdDev = static_cast(kTestDev[didx] * kTestMean[midx]); - VirtualSocketServer::Function* f = + std::unique_ptr f = VirtualSocketServer::CreateDistribution(kTestMean[midx], kStdDev, kTestSamples[sidx]); - ASSERT_TRUE(nullptr != f); + ASSERT_TRUE(nullptr != f.get()); ASSERT_EQ(kTestSamples[sidx], f->size()); double sum = 0; for (uint32_t i = 0; i < f->size(); ++i) { @@ -1139,7 +1139,6 @@ TEST_F(VirtualSocketServerTest, CreatesStandardDistribution) { EXPECT_NEAR(kStdDev, stddev, 0.1 * kStdDev) << "M=" << kTestMean[midx] << " SD=" << kStdDev << " N=" << kTestSamples[sidx]; - delete f; } } }