diff options
author | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2017-09-18 14:34:04 +0200 |
---|---|---|
committer | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2017-10-04 11:15:27 +0000 |
commit | e6430e577f105ad8813c92e75c54660c4985026e (patch) | |
tree | 88115e5d1fb471fea807111924dcccbeadbf9e4f /chromium/base/message_loop/message_loop.cc | |
parent | 53d399fe6415a96ea6986ec0d402a9c07da72453 (diff) |
BASELINE: Update Chromium to 61.0.3163.99
Change-Id: I8452f34574d88ca2b27af9bd56fc9ff3f16b1367
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
Diffstat (limited to 'chromium/base/message_loop/message_loop.cc')
-rw-r--r-- | chromium/base/message_loop/message_loop.cc | 85 |
1 files changed, 64 insertions, 21 deletions
diff --git a/chromium/base/message_loop/message_loop.cc b/chromium/base/message_loop/message_loop.cc index d72602babf6..a5c74e40a5f 100644 --- a/chromium/base/message_loop/message_loop.cc +++ b/chromium/base/message_loop/message_loop.cc @@ -22,9 +22,12 @@ #if defined(OS_MACOSX) #include "base/message_loop/message_pump_mac.h" #endif -#if defined(OS_POSIX) && !defined(OS_IOS) +#if defined(OS_POSIX) && !defined(OS_IOS) && !defined(OS_FUCHSIA) #include "base/message_loop/message_pump_libevent.h" #endif +#if defined(OS_FUCHSIA) +#include "base/message_loop/message_pump_fuchsia.h" +#endif #if defined(OS_ANDROID) #include "base/message_loop/message_pump_android.h" #endif @@ -46,13 +49,15 @@ MessageLoop::MessagePumpFactory* message_pump_for_ui_factory_ = NULL; #if defined(OS_IOS) typedef MessagePumpIOSForIO MessagePumpForIO; -#elif defined(OS_NACL_SFI) || defined(OS_FUCHSIA) +#elif defined(OS_NACL_SFI) typedef MessagePumpDefault MessagePumpForIO; +#elif defined(OS_FUCHSIA) +typedef MessagePumpFuchsia MessagePumpForIO; #elif defined(OS_POSIX) typedef MessagePumpLibevent MessagePumpForIO; #endif -#if !defined(OS_NACL_SFI) && !defined(OS_FUCHSIA) +#if !defined(OS_NACL_SFI) MessagePumpForIO* ToPumpIO(MessagePump* pump) { return static_cast<MessagePumpForIO*>(pump); } @@ -166,15 +171,15 @@ std::unique_ptr<MessagePump> MessageLoop::CreateMessagePumpForType(Type type) { typedef MessagePumpGlib MessagePumpForUI; #elif (defined(OS_LINUX) && !defined(OS_NACL)) || defined(OS_BSD) typedef MessagePumpLibevent MessagePumpForUI; +#elif defined(OS_FUCHSIA) + typedef MessagePumpFuchsia MessagePumpForUI; #endif #if defined(OS_IOS) || defined(OS_MACOSX) #define MESSAGE_PUMP_UI std::unique_ptr<MessagePump>(MessagePumpMac::Create()) -#elif defined(OS_NACL) || defined(OS_AIX) || defined(OS_FUCHSIA) +#elif defined(OS_NACL) || defined(OS_AIX) // Currently NaCl and AIX don't have a UI MessageLoop. // TODO(abarth): Figure out if we need this. -// TODO(fuchsia): Fuchsia may require one once more UI-level things have been -// ported. See https://crbug.com/706592. #define MESSAGE_PUMP_UI std::unique_ptr<MessagePump>() #else #define MESSAGE_PUMP_UI std::unique_ptr<MessagePump>(new MessagePumpForUI()) @@ -328,6 +333,10 @@ void MessageLoop::BindToCurrentThread() { SetThreadTaskRunnerHandle(); thread_id_ = PlatformThread::CurrentId(); + scoped_set_sequence_local_storage_map_for_current_thread_ = + MakeUnique<internal::ScopedSetSequenceLocalStorageMapForCurrentThread>( + &sequence_local_storage_map_); + run_loop_client_ = RunLoop::RegisterDelegateForCurrentThread(this); } @@ -377,15 +386,22 @@ bool MessageLoop::ProcessNextDelayedNonNestableTask() { if (run_loop_client_->IsNested()) return false; - if (deferred_non_nestable_work_queue_.empty()) - return false; + while (!deferred_non_nestable_work_queue_.empty()) { + PendingTask pending_task = + std::move(deferred_non_nestable_work_queue_.front()); + deferred_non_nestable_work_queue_.pop(); - PendingTask pending_task = - std::move(deferred_non_nestable_work_queue_.front()); - deferred_non_nestable_work_queue_.pop(); + if (!pending_task.task.IsCancelled()) { + RunTask(&pending_task); + return true; + } - RunTask(&pending_task); - return true; +#if defined(OS_WIN) + DecrementHighResTaskCountIfNeeded(pending_task); +#endif + } + + return false; } void MessageLoop::RunTask(PendingTask* pending_task) { @@ -393,10 +409,7 @@ void MessageLoop::RunTask(PendingTask* pending_task) { current_pending_task_ = pending_task; #if defined(OS_WIN) - if (pending_task->is_high_res) { - pending_high_res_tasks_--; - CHECK_GE(pending_high_res_tasks_, 0); - } + DecrementHighResTaskCountIfNeeded(*pending_task); #endif // Execute the task and assume the worst: It is probably not reentrant. @@ -434,6 +447,20 @@ void MessageLoop::AddToDelayedWorkQueue(PendingTask pending_task) { delayed_work_queue_.push(std::move(pending_task)); } +bool MessageLoop::SweepDelayedWorkQueueAndReturnTrueIfStillHasWork() { + while (!delayed_work_queue_.empty()) { + const PendingTask& pending_task = delayed_work_queue_.top(); + if (!pending_task.task.IsCancelled()) + return true; + +#if defined(OS_WIN) + DecrementHighResTaskCountIfNeeded(pending_task); +#endif + delayed_work_queue_.pop(); + } + return false; +} + bool MessageLoop::DeletePendingTasks() { bool did_work = !work_queue_.empty(); while (!work_queue_.empty()) { @@ -497,7 +524,12 @@ bool MessageLoop::DoWork() { do { PendingTask pending_task = std::move(work_queue_.front()); work_queue_.pop(); - if (!pending_task.delayed_run_time.is_null()) { + + if (pending_task.task.IsCancelled()) { +#if defined(OS_WIN) + DecrementHighResTaskCountIfNeeded(pending_task); +#endif + } else if (!pending_task.delayed_run_time.is_null()) { int sequence_num = pending_task.sequence_num; TimeTicks delayed_run_time = pending_task.delayed_run_time; AddToDelayedWorkQueue(std::move(pending_task)); @@ -516,7 +548,8 @@ bool MessageLoop::DoWork() { } bool MessageLoop::DoDelayedWork(TimeTicks* next_delayed_work_time) { - if (!nestable_tasks_allowed_ || delayed_work_queue_.empty()) { + if (!nestable_tasks_allowed_ || + !SweepDelayedWorkQueueAndReturnTrueIfStillHasWork()) { recent_time_ = *next_delayed_work_time = TimeTicks(); return false; } @@ -541,7 +574,7 @@ bool MessageLoop::DoDelayedWork(TimeTicks* next_delayed_work_time) { std::move(const_cast<PendingTask&>(delayed_work_queue_.top())); delayed_work_queue_.pop(); - if (!delayed_work_queue_.empty()) + if (SweepDelayedWorkQueueAndReturnTrueIfStillHasWork()) *next_delayed_work_time = delayed_work_queue_.top().delayed_run_time; return DeferOrRunPendingTask(std::move(pending_task)); @@ -569,6 +602,16 @@ bool MessageLoop::DoIdleWork() { return false; } +#if defined(OS_WIN) +void MessageLoop::DecrementHighResTaskCountIfNeeded( + const PendingTask& pending_task) { + if (!pending_task.is_high_res) + return; + --pending_high_res_tasks_; + DCHECK_GE(pending_high_res_tasks_, 0); +} +#endif + #if !defined(OS_NACL) //------------------------------------------------------------------------------ // MessageLoopForUI @@ -636,7 +679,7 @@ bool MessageLoopForIO::RegisterJobObject(HANDLE job, IOHandler* handler) { bool MessageLoopForIO::WaitForIOCompletion(DWORD timeout, IOHandler* filter) { return ToPumpIO(pump_.get())->WaitForIOCompletion(timeout, filter); } -#elif defined(OS_POSIX) && !defined(OS_FUCHSIA) +#elif defined(OS_POSIX) bool MessageLoopForIO::WatchFileDescriptor(int fd, bool persistent, Mode mode, |