summaryrefslogtreecommitdiffstats
path: root/chromium/base/message_loop/message_loop.cc
diff options
context:
space:
mode:
authorAllan Sandfeld Jensen <allan.jensen@qt.io>2017-09-18 14:34:04 +0200
committerAllan Sandfeld Jensen <allan.jensen@qt.io>2017-10-04 11:15:27 +0000
commite6430e577f105ad8813c92e75c54660c4985026e (patch)
tree88115e5d1fb471fea807111924dcccbeadbf9e4f /chromium/base/message_loop/message_loop.cc
parent53d399fe6415a96ea6986ec0d402a9c07da72453 (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.cc85
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,