diff --git a/p2p/BUILD.gn b/p2p/BUILD.gn index 8cdb663d0c..4b377e9850 100644 --- a/p2p/BUILD.gn +++ b/p2p/BUILD.gn @@ -286,9 +286,13 @@ rtc_library("p2p_server_utils") { "../rtc_base:rtc_base_tests_utils", "../rtc_base:socket_address", "../rtc_base:threading", + "../rtc_base/task_utils:to_queued_task", "../rtc_base/third_party/sigslot", ] - absl_deps = [ "//third_party/abseil-cpp/absl/algorithm:container" ] + absl_deps = [ + "//third_party/abseil-cpp/absl/algorithm:container", + "//third_party/abseil-cpp/absl/memory", + ] } rtc_library("libstunprober") { diff --git a/p2p/base/turn_server.cc b/p2p/base/turn_server.cc index 1658c25c88..53f283bc96 100644 --- a/p2p/base/turn_server.cc +++ b/p2p/base/turn_server.cc @@ -15,6 +15,7 @@ #include #include "absl/algorithm/container.h" +#include "absl/memory/memory.h" #include "api/packet_socket_factory.h" #include "api/transport/stun.h" #include "p2p/base/async_stun_tcp_socket.h" @@ -25,6 +26,7 @@ #include "rtc_base/message_digest.h" #include "rtc_base/socket_adapters.h" #include "rtc_base/strings/string_builder.h" +#include "rtc_base/task_utils/to_queued_task.h" #include "rtc_base/thread.h" namespace cricket { @@ -554,22 +556,16 @@ void TurnServer::DestroyInternalSocket(rtc::AsyncPacketSocket* socket) { rtc::AsyncPacketSocket* socket = iter->first; socket->SignalReadPacket.disconnect(this); server_sockets_.erase(iter); + std::unique_ptr socket_to_delete = + absl::WrapUnique(socket); // We must destroy the socket async to avoid invalidating the sigslot // callback list iterator inside a sigslot callback. (In other words, // deleting an object from within a callback from that object). - sockets_to_delete_.push_back( - std::unique_ptr(socket)); - invoker_.AsyncInvoke(RTC_FROM_HERE, rtc::Thread::Current(), [this] { - RTC_DCHECK_RUN_ON(thread_); - FreeSockets(); - }); + thread_->PostTask(webrtc::ToQueuedTask( + [socket_to_delete = std::move(socket_to_delete)] {})); } } -void TurnServer::FreeSockets() { - sockets_to_delete_.clear(); -} - TurnServerConnection::TurnServerConnection(const rtc::SocketAddress& src, ProtocolType proto, rtc::AsyncPacketSocket* socket) diff --git a/p2p/base/turn_server.h b/p2p/base/turn_server.h index efbf9afcc5..f90c3dac0d 100644 --- a/p2p/base/turn_server.h +++ b/p2p/base/turn_server.h @@ -21,7 +21,6 @@ #include "api/sequence_checker.h" #include "p2p/base/port_interface.h" -#include "rtc_base/async_invoker.h" #include "rtc_base/async_packet_socket.h" #include "rtc_base/socket_address.h" #include "rtc_base/third_party/sigslot/sigslot.h" @@ -320,9 +319,6 @@ class TurnServer : public sigslot::has_slots<> { void DestroyInternalSocket(rtc::AsyncPacketSocket* socket) RTC_RUN_ON(thread_); - // Just clears |sockets_to_delete_|; called asynchronously. - void FreeSockets() RTC_RUN_ON(thread_); - typedef std::map InternalSocketMap; typedef std::map ServerSocketMap; @@ -341,17 +337,12 @@ class TurnServer : public sigslot::has_slots<> { InternalSocketMap server_sockets_ RTC_GUARDED_BY(thread_); ServerSocketMap server_listen_sockets_ RTC_GUARDED_BY(thread_); - // Used when we need to delete a socket asynchronously. - std::vector> sockets_to_delete_ - RTC_GUARDED_BY(thread_); std::unique_ptr external_socket_factory_ RTC_GUARDED_BY(thread_); rtc::SocketAddress external_addr_ RTC_GUARDED_BY(thread_); AllocationMap allocations_ RTC_GUARDED_BY(thread_); - rtc::AsyncInvoker invoker_; - // For testing only. If this is non-zero, the next NONCE will be generated // from this value, and it will be reset to 0 after generating the NONCE. int64_t ts_for_next_nonce_ RTC_GUARDED_BY(thread_) = 0;