Commit 1e6a6033 authored by Carlos Caballero's avatar Carlos Caballero Committed by Commit Bot

Replace lock with base::internal::OperationsController

BUG=901345

Change-Id: I90afa3439fedc68032ab69158d2ecfae2ba52884
Reviewed-on: https://chromium-review.googlesource.com/c/1343088
Commit-Queue: Carlos Caballero <carlscab@google.com>
Reviewed-by: default avatarAlex Clarke <alexclarke@chromium.org>
Cr-Commit-Position: refs/heads/master@{#609984}
parent b970401f
...@@ -4,7 +4,6 @@ ...@@ -4,7 +4,6 @@
#include "base/task/sequence_manager/thread_controller_with_message_pump_impl.h" #include "base/task/sequence_manager/thread_controller_with_message_pump_impl.h"
#include "base/auto_reset.h"
#include "base/message_loop/message_pump.h" #include "base/message_loop/message_pump.h"
#include "base/time/tick_clock.h" #include "base/time/tick_clock.h"
#include "base/trace_event/trace_event.h" #include "base/trace_event/trace_event.h"
...@@ -46,6 +45,7 @@ ThreadControllerWithMessagePumpImpl::ThreadControllerWithMessagePumpImpl( ...@@ -46,6 +45,7 @@ ThreadControllerWithMessagePumpImpl::ThreadControllerWithMessagePumpImpl(
} }
ThreadControllerWithMessagePumpImpl::~ThreadControllerWithMessagePumpImpl() { ThreadControllerWithMessagePumpImpl::~ThreadControllerWithMessagePumpImpl() {
operations_controller_.ShutdownAndWaitForZeroOperations();
// Destructors of MessagePump::Delegate and ThreadTaskRunnerHandle // Destructors of MessagePump::Delegate and ThreadTaskRunnerHandle
// will do all the clean-up. // will do all the clean-up.
// ScopedSetSequenceLocalStorageMapForCurrentThread destructor will // ScopedSetSequenceLocalStorageMapForCurrentThread destructor will
...@@ -80,7 +80,6 @@ void ThreadControllerWithMessagePumpImpl::BindToCurrentThread( ...@@ -80,7 +80,6 @@ void ThreadControllerWithMessagePumpImpl::BindToCurrentThread(
void ThreadControllerWithMessagePumpImpl::BindToCurrentThread( void ThreadControllerWithMessagePumpImpl::BindToCurrentThread(
std::unique_ptr<MessagePump> message_pump) { std::unique_ptr<MessagePump> message_pump) {
associated_thread_->BindToCurrentThread(); associated_thread_->BindToCurrentThread();
AutoLock lock(pump_lock_);
pump_ = std::move(message_pump); pump_ = std::move(message_pump);
RunLoop::RegisterDelegateForCurrentThread(this); RunLoop::RegisterDelegateForCurrentThread(this);
scoped_set_sequence_local_storage_map_for_current_thread_ = std::make_unique< scoped_set_sequence_local_storage_map_for_current_thread_ = std::make_unique<
...@@ -91,7 +90,7 @@ void ThreadControllerWithMessagePumpImpl::BindToCurrentThread( ...@@ -91,7 +90,7 @@ void ThreadControllerWithMessagePumpImpl::BindToCurrentThread(
if (task_runner_) if (task_runner_)
InitializeThreadTaskRunnerHandle(); InitializeThreadTaskRunnerHandle();
} }
if (should_schedule_work_after_bind_) if (operations_controller_.StartAcceptingOperations())
ScheduleWork(); ScheduleWork();
} }
...@@ -113,12 +112,9 @@ void ThreadControllerWithMessagePumpImpl::WillQueueTask( ...@@ -113,12 +112,9 @@ void ThreadControllerWithMessagePumpImpl::WillQueueTask(
} }
void ThreadControllerWithMessagePumpImpl::ScheduleWork() { void ThreadControllerWithMessagePumpImpl::ScheduleWork() {
auto lock = AcquirePumpReadLockIfNeeded(); auto operation_token = operations_controller_.TryBeginOperation();
if (!operation_token)
if (!pump_) {
should_schedule_work_after_bind_ = true;
return; return;
}
// This assumes that cross thread ScheduleWork isn't frequent enough to // This assumes that cross thread ScheduleWork isn't frequent enough to
// warrant ScheduleWork deduplication. // warrant ScheduleWork deduplication.
...@@ -381,13 +377,6 @@ bool ThreadControllerWithMessagePumpImpl::IsTaskExecutionAllowed() const { ...@@ -381,13 +377,6 @@ bool ThreadControllerWithMessagePumpImpl::IsTaskExecutionAllowed() const {
return main_thread_only().task_execution_allowed; return main_thread_only().task_execution_allowed;
} }
Optional<MoveableAutoLock>
ThreadControllerWithMessagePumpImpl::AcquirePumpReadLockIfNeeded() {
if (RunsTasksInCurrentSequence())
return nullopt;
return MoveableAutoLock(pump_lock_);
}
MessagePump* ThreadControllerWithMessagePumpImpl::GetBoundMessagePump() const { MessagePump* ThreadControllerWithMessagePumpImpl::GetBoundMessagePump() const {
return pump_.get(); return pump_.get();
} }
......
...@@ -9,10 +9,9 @@ ...@@ -9,10 +9,9 @@
#include "base/debug/task_annotator.h" #include "base/debug/task_annotator.h"
#include "base/message_loop/message_pump.h" #include "base/message_loop/message_pump.h"
#include "base/optional.h"
#include "base/run_loop.h" #include "base/run_loop.h"
#include "base/task/common/operations_controller.h"
#include "base/task/sequence_manager/associated_thread_id.h" #include "base/task/sequence_manager/associated_thread_id.h"
#include "base/task/sequence_manager/moveable_auto_lock.h"
#include "base/task/sequence_manager/sequenced_task_source.h" #include "base/task/sequence_manager/sequenced_task_source.h"
#include "base/task/sequence_manager/thread_controller.h" #include "base/task/sequence_manager/thread_controller.h"
#include "base/thread_annotations.h" #include "base/thread_annotations.h"
...@@ -140,12 +139,6 @@ class BASE_EXPORT ThreadControllerWithMessagePumpImpl ...@@ -140,12 +139,6 @@ class BASE_EXPORT ThreadControllerWithMessagePumpImpl
return main_thread_only_; return main_thread_only_;
} }
// Acquires a |pump_lock_| if necessary when we want to read |pump_|.
// Non-main thread read access should be guarded by a lock,
// while main-thread access can be lock-free. Write access is possible
// only from the main thread and needs a lock.
Optional<MoveableAutoLock> AcquirePumpReadLockIfNeeded();
// TODO(altimin): Merge with the one in SequenceManager. // TODO(altimin): Merge with the one in SequenceManager.
scoped_refptr<AssociatedThreadId> associated_thread_; scoped_refptr<AssociatedThreadId> associated_thread_;
MainThreadOnly main_thread_only_; MainThreadOnly main_thread_only_;
...@@ -154,12 +147,13 @@ class BASE_EXPORT ThreadControllerWithMessagePumpImpl ...@@ -154,12 +147,13 @@ class BASE_EXPORT ThreadControllerWithMessagePumpImpl
scoped_refptr<SingleThreadTaskRunner> task_runner_ scoped_refptr<SingleThreadTaskRunner> task_runner_
GUARDED_BY(task_runner_lock_); GUARDED_BY(task_runner_lock_);
// Protects |pump_| and |should_schedule_work_after_bind_| as work can be // OperationsController will only be started after |pump_| is set.
// scheduled from another thread before we create the pump. ::base::internal::OperationsController operations_controller_;
// TODO(altimin, crbug.com/901345): Remove this lock.
base::Lock pump_lock_; // Can only be set once (just before calling
// operations_controller_.StartAcceptingOperations()). After that only read
// access is allowed.
std::unique_ptr<MessagePump> pump_; std::unique_ptr<MessagePump> pump_;
bool should_schedule_work_after_bind_ = false;
debug::TaskAnnotator task_annotator_; debug::TaskAnnotator task_annotator_;
const TickClock* time_source_; // Not owned. const TickClock* time_source_; // Not owned.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment