diff --git a/test/network/BUILD.gn b/test/network/BUILD.gn index 6e1cfe1242..1073f229bd 100644 --- a/test/network/BUILD.gn +++ b/test/network/BUILD.gn @@ -41,6 +41,7 @@ rtc_library("emulated_network") { "../../api:array_view", "../../api:network_emulation_manager_api", "../../api:packet_socket_factory", + "../../api:scoped_refptr", "../../api:simulated_network_api", "../../api:time_controller", "../../api/numerics", @@ -65,7 +66,9 @@ rtc_library("emulated_network") { "../../rtc_base:threading", "../../rtc_base/synchronization:mutex", "../../rtc_base/synchronization:sequence_checker", + "../../rtc_base/task_utils:pending_task_safety_flag", "../../rtc_base/task_utils:repeating_task", + "../../rtc_base/task_utils:to_queued_task", "../../rtc_base/third_party/sigslot", "../../system_wrappers", "../scenario:column_printer", diff --git a/test/network/fake_network_socket_server.cc b/test/network/fake_network_socket_server.cc index bee2846be7..e2e1319949 100644 --- a/test/network/fake_network_socket_server.cc +++ b/test/network/fake_network_socket_server.cc @@ -16,8 +16,10 @@ #include #include "absl/algorithm/container.h" -#include "rtc_base/async_invoker.h" +#include "api/scoped_refptr.h" #include "rtc_base/logging.h" +#include "rtc_base/task_utils/pending_task_safety_flag.h" +#include "rtc_base/task_utils/to_queued_task.h" #include "rtc_base/thread.h" namespace webrtc { @@ -74,7 +76,7 @@ class FakeNetworkSocket : public rtc::AsyncSocket, std::map options_map_ RTC_GUARDED_BY(&thread_); absl::optional pending_ RTC_GUARDED_BY(thread_); - rtc::AsyncInvoker invoker_; + rtc::scoped_refptr alive_; }; FakeNetworkSocket::FakeNetworkSocket(FakeNetworkSocketServer* socket_server, @@ -82,9 +84,13 @@ FakeNetworkSocket::FakeNetworkSocket(FakeNetworkSocketServer* socket_server, : socket_server_(socket_server), thread_(thread), state_(CS_CLOSED), - error_(0) {} + error_(0), + alive_(PendingTaskSafetyFlag::Create()) {} FakeNetworkSocket::~FakeNetworkSocket() { + // Abandon all pending packets. + alive_->SetNotAlive(); + Close(); socket_server_->Unregister(this); } @@ -103,7 +109,7 @@ void FakeNetworkSocket::OnPacketReceived(EmulatedIpPacket packet) { SignalReadEvent(this); RTC_DCHECK(!pending_); }; - invoker_.AsyncInvoke(RTC_FROM_HERE, thread_, std::move(task)); + thread_->PostTask(ToQueuedTask(alive_, std::move(task))); socket_server_->WakeUp(); } diff --git a/test/network/network_emulation_unittest.cc b/test/network/network_emulation_unittest.cc index c92b344872..7bebc66680 100644 --- a/test/network/network_emulation_unittest.cc +++ b/test/network/network_emulation_unittest.cc @@ -207,8 +207,14 @@ TEST(NetworkEmulationManagerTest, Run) { rtc::CopyOnWriteBuffer data("Hello"); for (uint64_t j = 0; j < 2; j++) { - auto* s1 = t1->socketserver()->CreateAsyncSocket(AF_INET, SOCK_DGRAM); - auto* s2 = t2->socketserver()->CreateAsyncSocket(AF_INET, SOCK_DGRAM); + rtc::AsyncSocket* s1 = nullptr; + rtc::AsyncSocket* s2 = nullptr; + t1->Invoke(RTC_FROM_HERE, [&] { + s1 = t1->socketserver()->CreateAsyncSocket(AF_INET, SOCK_DGRAM); + }); + t2->Invoke(RTC_FROM_HERE, [&] { + s2 = t2->socketserver()->CreateAsyncSocket(AF_INET, SOCK_DGRAM); + }); SocketReader r1(s1, t1); SocketReader r2(s2, t2); @@ -357,8 +363,14 @@ TEST(NetworkEmulationManagerTest, DebugStatsCollectedInDebugMode) { rtc::CopyOnWriteBuffer data("Hello"); for (uint64_t j = 0; j < 2; j++) { - auto* s1 = t1->socketserver()->CreateAsyncSocket(AF_INET, SOCK_DGRAM); - auto* s2 = t2->socketserver()->CreateAsyncSocket(AF_INET, SOCK_DGRAM); + rtc::AsyncSocket* s1 = nullptr; + rtc::AsyncSocket* s2 = nullptr; + t1->Invoke(RTC_FROM_HERE, [&] { + s1 = t1->socketserver()->CreateAsyncSocket(AF_INET, SOCK_DGRAM); + }); + t2->Invoke(RTC_FROM_HERE, [&] { + s2 = t2->socketserver()->CreateAsyncSocket(AF_INET, SOCK_DGRAM); + }); SocketReader r1(s1, t1); SocketReader r2(s2, t2); @@ -454,8 +466,15 @@ TEST(NetworkEmulationManagerTest, ThroughputStats) { constexpr int64_t kUdpPayloadSize = 100; constexpr int64_t kSinglePacketSize = kUdpPayloadSize + kOverheadIpv4Udp; rtc::CopyOnWriteBuffer data(kUdpPayloadSize); - auto* s1 = t1->socketserver()->CreateAsyncSocket(AF_INET, SOCK_DGRAM); - auto* s2 = t2->socketserver()->CreateAsyncSocket(AF_INET, SOCK_DGRAM); + + rtc::AsyncSocket* s1 = nullptr; + rtc::AsyncSocket* s2 = nullptr; + t1->Invoke(RTC_FROM_HERE, [&] { + s1 = t1->socketserver()->CreateAsyncSocket(AF_INET, SOCK_DGRAM); + }); + t2->Invoke(RTC_FROM_HERE, [&] { + s2 = t2->socketserver()->CreateAsyncSocket(AF_INET, SOCK_DGRAM); + }); SocketReader r1(s1, t1); SocketReader r2(s2, t2);