Make sure that "current" rtc::Thread instances are always current for TaskQueueBase.
This is a necessary part of fulfilling the TaskQueueBase interface. If a thread does not register as the current TQ, yet offers the TQ interface, TQ 'current' checks will not work as expected and code that relies them (TaskQueueBase::Current() and IsCurrent()) will run in unexpected ways. Bug: webrtc:11572 Change-Id: Iab747bc474e74e6ce4f9e914cfd5b0578b19d19c Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/175080 Reviewed-by: Mirko Bonadei <mbonadei@webrtc.org> Commit-Queue: Tommi <tommi@webrtc.org> Cr-Commit-Position: refs/heads/master@{#31254}
This commit is contained in:
@ -296,6 +296,21 @@ void ThreadManager::SetCurrentThread(Thread* thread) {
|
||||
RTC_DLOG(LS_ERROR) << "SetCurrentThread: Overwriting an existing value?";
|
||||
}
|
||||
#endif // RTC_DLOG_IS_ON
|
||||
|
||||
if (thread) {
|
||||
thread->EnsureIsCurrentTaskQueue();
|
||||
} else {
|
||||
Thread* current = CurrentThread();
|
||||
if (current) {
|
||||
// The current thread is being cleared, e.g. as a result of
|
||||
// UnwrapCurrent() being called or when a thread is being stopped
|
||||
// (see PreRun()). This signals that the Thread instance is being detached
|
||||
// from the thread, which also means that TaskQueue::Current() must not
|
||||
// return a pointer to the Thread instance.
|
||||
current->ClearCurrentTaskQueue();
|
||||
}
|
||||
}
|
||||
|
||||
SetCurrentThreadInternal(thread);
|
||||
}
|
||||
|
||||
@ -824,7 +839,6 @@ void* Thread::PreRun(void* pv) {
|
||||
Thread* thread = static_cast<Thread*>(pv);
|
||||
ThreadManager::Instance()->SetCurrentThread(thread);
|
||||
rtc::SetCurrentThreadName(thread->name_.c_str());
|
||||
CurrentTaskQueueSetter set_current_task_queue(thread);
|
||||
#if defined(WEBRTC_MAC)
|
||||
ScopedAutoReleasePool pool;
|
||||
#endif
|
||||
@ -935,6 +949,17 @@ void Thread::InvokeInternal(const Location& posted_from,
|
||||
Send(posted_from, &handler);
|
||||
}
|
||||
|
||||
// Called by the ThreadManager when being set as the current thread.
|
||||
void Thread::EnsureIsCurrentTaskQueue() {
|
||||
task_queue_registration_ =
|
||||
std::make_unique<TaskQueueBase::CurrentTaskQueueSetter>(this);
|
||||
}
|
||||
|
||||
// Called by the ThreadManager when being set as the current thread.
|
||||
void Thread::ClearCurrentTaskQueue() {
|
||||
task_queue_registration_.reset();
|
||||
}
|
||||
|
||||
void Thread::QueuedTaskHandler::OnMessage(Message* msg) {
|
||||
RTC_DCHECK(msg);
|
||||
auto* data = static_cast<ScopedMessageData<webrtc::QueuedTask>*>(msg->pdata);
|
||||
|
||||
Reference in New Issue
Block a user