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:
Tommi
2020-05-14 13:27:19 +02:00
committed by Commit Bot
parent f8cb70a343
commit 46b3bc6c24
5 changed files with 50 additions and 4 deletions

View File

@ -551,6 +551,12 @@ class RTC_LOCKABLE RTC_EXPORT Thread : public webrtc::TaskQueueBase {
void InvokeInternal(const Location& posted_from,
rtc::FunctionView<void()> functor);
// Called by the ThreadManager when being set as the current thread.
void EnsureIsCurrentTaskQueue();
// Called by the ThreadManager when being unset as the current thread.
void ClearCurrentTaskQueue();
// Returns a static-lifetime MessageHandler which runs message with
// MessageLikeTask payload data.
static MessageHandler* GetPostTaskMessageHandler();
@ -595,6 +601,8 @@ class RTC_LOCKABLE RTC_EXPORT Thread : public webrtc::TaskQueueBase {
// Runs webrtc::QueuedTask posted to the Thread.
QueuedTaskHandler queued_task_handler_;
std::unique_ptr<TaskQueueBase::CurrentTaskQueueSetter>
task_queue_registration_;
friend class ThreadManager;