diff --git a/pc/connection_context.cc b/pc/connection_context.cc index d048218cb9..ec6f21cc13 100644 --- a/pc/connection_context.cc +++ b/pc/connection_context.cc @@ -173,8 +173,15 @@ ConnectionContext::ConnectionContext( ConnectionContext::~ConnectionContext() { RTC_DCHECK_RUN_ON(signaling_thread_); - // `media_engine_` requires destruction to happen on the worker thread. - worker_thread_->PostTask([media_engine = std::move(media_engine_)] {}); + worker_thread_->BlockingCall([&] { + RTC_DCHECK_RUN_ON(worker_thread()); + // While `media_engine_` is const throughout the ConnectionContext's + // lifetime, it requires destruction to happen on the worker thread. Instead + // of marking the pointer as non-const, we live with this const_cast<> in + // the destructor. + const_cast&>(media_engine_) + .reset(); + }); // Make sure `worker_thread()` and `signaling_thread()` outlive // `default_socket_factory_` and `default_network_manager_`. diff --git a/pc/connection_context.h b/pc/connection_context.h index 44fc4878e7..0fe20c7890 100644 --- a/pc/connection_context.h +++ b/pc/connection_context.h @@ -122,7 +122,7 @@ class ConnectionContext final // Accessed both on signaling thread and worker thread. std::unique_ptr const trials_; - std::unique_ptr media_engine_; + const std::unique_ptr media_engine_; // This object should be used to generate any SSRC that is not explicitly // specified by the user (or by the remote party).