/* * Copyright 2020 The WebRTC project authors. All Rights Reserved. * * Use of this source code is governed by a BSD-style license * that can be found in the LICENSE file in the root of the source * tree. An additional intellectual property rights grant can be found * in the file PATENTS. All contributing project authors may * be found in the AUTHORS file in the root of the source tree.
*/
rtc::Thread* MaybeWrapThread(rtc::Thread* signaling_thread, bool& wraps_current_thread) {
wraps_current_thread = false; if (signaling_thread) { return signaling_thread;
} auto this_thread = rtc::Thread::Current(); if (!this_thread) { // If this thread isn't already wrapped by an rtc::Thread, create a // wrapper and own it in this class.
this_thread = rtc::ThreadManager::Instance()->WrapCurrentThread();
wraps_current_thread = true;
} return this_thread;
}
signaling_thread_->AllowInvokesToThread(worker_thread());
signaling_thread_->AllowInvokesToThread(network_thread_);
worker_thread_->AllowInvokesToThread(network_thread_); if (!network_thread_->IsCurrent()) { // network_thread_->IsCurrent() == true means signaling_thread_ is // network_thread_. In this case, no further action is required as // signaling_thread_ can already invoke network_thread_.
network_thread_->PostTask(
[thread = network_thread_, worker_thread = worker_thread_.get()] {
thread->DisallowBlockingCalls();
thread->DisallowAllInvokes(); if (worker_thread == thread) { // In this case, worker_thread_ == network_thread_
thread->AllowInvokesToThread(thread);
}
});
}
rtc::InitRandom(rtc::Time32());
rtc::SocketFactory* socket_factory = dependencies->socket_factory; if (socket_factory == nullptr) { if (owned_socket_factory_) {
socket_factory = owned_socket_factory_.get();
} else { // TODO(bugs.webrtc.org/13145): This case should be deleted. Either // require that a PacketSocketFactory and NetworkManager always are // injected (with no need to construct these default objects), or require // that if a network_thread is injected, an approprite rtc::SocketServer // should be injected too.
socket_factory = network_thread()->socketserver();
}
} if (!default_network_manager_) { // If network_monitor_factory_ is non-null, it will be used to create a // network monitor while on the network thread.
default_network_manager_ = std::make_unique<rtc::BasicNetworkManager>(
network_monitor_factory_.get(), socket_factory, &env_.field_trials());
} if (!default_socket_factory_) {
default_socket_factory_ =
std::make_unique<rtc::BasicPacketSocketFactory>(socket_factory);
} // Set warning levels on the threads, to give warnings when response // may be slower than is expected of the thread. // Since some of the threads may be the same, start with the least // restrictive limits and end with the least permissive ones. // This will give warnings for all cases.
signaling_thread_->SetDispatchWarningMs(100);
worker_thread_->SetDispatchWarningMs(30);
network_thread_->SetDispatchWarningMs(10);
if (media_engine_) { // TODO(tommi): Change VoiceEngine to do ctor time initialization so that // this isn't necessary.
worker_thread_->BlockingCall([&] { media_engine_->Init(); });
}
}
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_)] {});
// Make sure `worker_thread()` and `signaling_thread()` outlive // `default_socket_factory_` and `default_network_manager_`.
default_socket_factory_ = nullptr;
default_network_manager_ = nullptr;
if (wraps_current_thread_)
rtc::ThreadManager::Instance()->UnwrapCurrentThread();
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.