diff options
Diffstat (limited to 'base/message_loop')
-rw-r--r-- | base/message_loop/incoming_task_queue.cc | 3 | ||||
-rw-r--r-- | base/message_loop/incoming_task_queue.h | 2 | ||||
-rw-r--r-- | base/message_loop/message_loop_task_runner.cc | 4 | ||||
-rw-r--r-- | base/message_loop/message_loop_task_runner.h | 4 | ||||
-rw-r--r-- | base/message_loop/message_loop_task_runner_unittest.cc | 11 | ||||
-rw-r--r-- | base/message_loop/message_loop_unittest.cc | 31 | ||||
-rw-r--r-- | base/message_loop/message_pump_glib_unittest.cc | 1 | ||||
-rw-r--r-- | base/message_loop/message_pump_libevent.cc | 1 |
8 files changed, 37 insertions, 20 deletions
diff --git a/base/message_loop/incoming_task_queue.cc b/base/message_loop/incoming_task_queue.cc index f0df650adc..316b5ec645 100644 --- a/base/message_loop/incoming_task_queue.cc +++ b/base/message_loop/incoming_task_queue.cc @@ -60,9 +60,10 @@ IncomingTaskQueue::IncomingTaskQueue(MessageLoop* message_loop) bool IncomingTaskQueue::AddToIncomingQueue( const tracked_objects::Location& from_here, - Closure task, + OnceClosure task, TimeDelta delay, bool nestable) { + DCHECK(task); DLOG_IF(WARNING, delay.InSeconds() > kTaskDelayWarningThresholdInSeconds) << "Requesting super-long task delay period of " << delay.InSeconds() diff --git a/base/message_loop/incoming_task_queue.h b/base/message_loop/incoming_task_queue.h index a912dc2ee1..17bea07674 100644 --- a/base/message_loop/incoming_task_queue.h +++ b/base/message_loop/incoming_task_queue.h @@ -36,7 +36,7 @@ class BASE_EXPORT IncomingTaskQueue // returns false. In all cases, the ownership of |task| is transferred to the // called method. bool AddToIncomingQueue(const tracked_objects::Location& from_here, - Closure task, + OnceClosure task, TimeDelta delay, bool nestable); diff --git a/base/message_loop/message_loop_task_runner.cc b/base/message_loop/message_loop_task_runner.cc index ddfdeb2b65..aece087b76 100644 --- a/base/message_loop/message_loop_task_runner.cc +++ b/base/message_loop/message_loop_task_runner.cc @@ -26,7 +26,7 @@ void MessageLoopTaskRunner::BindToCurrentThread() { bool MessageLoopTaskRunner::PostDelayedTask( const tracked_objects::Location& from_here, - Closure task, + OnceClosure task, base::TimeDelta delay) { DCHECK(!task.is_null()) << from_here.ToString(); return incoming_queue_->AddToIncomingQueue(from_here, std::move(task), delay, @@ -35,7 +35,7 @@ bool MessageLoopTaskRunner::PostDelayedTask( bool MessageLoopTaskRunner::PostNonNestableDelayedTask( const tracked_objects::Location& from_here, - Closure task, + OnceClosure task, base::TimeDelta delay) { DCHECK(!task.is_null()) << from_here.ToString(); return incoming_queue_->AddToIncomingQueue(from_here, std::move(task), delay, diff --git a/base/message_loop/message_loop_task_runner.h b/base/message_loop/message_loop_task_runner.h index 11ee8a6bf7..99a96a711e 100644 --- a/base/message_loop/message_loop_task_runner.h +++ b/base/message_loop/message_loop_task_runner.h @@ -32,10 +32,10 @@ class BASE_EXPORT MessageLoopTaskRunner : public SingleThreadTaskRunner { // SingleThreadTaskRunner implementation bool PostDelayedTask(const tracked_objects::Location& from_here, - Closure task, + OnceClosure task, base::TimeDelta delay) override; bool PostNonNestableDelayedTask(const tracked_objects::Location& from_here, - Closure task, + OnceClosure task, base::TimeDelta delay) override; bool RunsTasksOnCurrentThread() const override; diff --git a/base/message_loop/message_loop_task_runner_unittest.cc b/base/message_loop/message_loop_task_runner_unittest.cc index 54551daadd..d403c70700 100644 --- a/base/message_loop/message_loop_task_runner_unittest.cc +++ b/base/message_loop/message_loop_task_runner_unittest.cc @@ -127,7 +127,7 @@ TEST_F(MessageLoopTaskRunnerTest, PostTaskAndReply_Basic) { RunLoop().Run(); EXPECT_EQ(task_thread_.message_loop(), task_run_on); - EXPECT_EQ(current_loop_.get(), task_deleted_on); + EXPECT_EQ(task_thread_.message_loop(), task_deleted_on); EXPECT_EQ(current_loop_.get(), reply_run_on); EXPECT_EQ(current_loop_.get(), reply_deleted_on); EXPECT_LT(task_delete_order, reply_delete_order); @@ -200,7 +200,8 @@ TEST_F(MessageLoopTaskRunnerTest, PostTaskAndReply_SameLoop) { EXPECT_LT(task_delete_order, reply_delete_order); } -TEST_F(MessageLoopTaskRunnerTest, PostTaskAndReply_DeadReplyLoopDoesNotDelete) { +TEST_F(MessageLoopTaskRunnerTest, + PostTaskAndReply_DeadReplyTaskRunnerBehavior) { // Annotate the scope as having memory leaks to suppress heapchecker reports. ANNOTATE_SCOPED_MEMORY_LEAK; MessageLoop* task_run_on = NULL; @@ -237,11 +238,13 @@ TEST_F(MessageLoopTaskRunnerTest, PostTaskAndReply_DeadReplyLoopDoesNotDelete) { MessageLoop* task_loop = task_thread_.message_loop(); task_thread_.Stop(); + // Even if the reply task runner is already gone, the original task should + // already be deleted. However, the reply which hasn't executed yet should + // leak to avoid thread-safety issues. EXPECT_EQ(task_loop, task_run_on); - ASSERT_FALSE(task_deleted_on); + EXPECT_EQ(task_loop, task_deleted_on); EXPECT_FALSE(reply_run_on); ASSERT_FALSE(reply_deleted_on); - EXPECT_EQ(task_delete_order, reply_delete_order); // The PostTaskAndReplyRelay is leaked here. Even if we had a reference to // it, we cannot just delete it because PostTaskAndReplyRelay's destructor diff --git a/base/message_loop/message_loop_unittest.cc b/base/message_loop/message_loop_unittest.cc index 14fe1ee391..9d771d5ecb 100644 --- a/base/message_loop/message_loop_unittest.cc +++ b/base/message_loop/message_loop_unittest.cc @@ -12,6 +12,7 @@ #include "base/compiler_specific.h" #include "base/logging.h" #include "base/macros.h" +#include "base/memory/ptr_util.h" #include "base/memory/ref_counted.h" #include "base/message_loop/message_loop.h" #include "base/message_loop/message_loop_test.h" @@ -93,16 +94,19 @@ void AbortMessagePump() { static_cast<base::MessageLoopForUI*>(base::MessageLoop::current())->Abort(); } -void RunTest_AbortDontRunMoreTasks(bool delayed) { - MessageLoop loop(MessageLoop::TYPE_JAVA); - +void RunTest_AbortDontRunMoreTasks(bool delayed, bool init_java_first) { WaitableEvent test_done_event(WaitableEvent::ResetPolicy::MANUAL, WaitableEvent::InitialState::NOT_SIGNALED); - std::unique_ptr<android::JavaHandlerThreadForTesting> java_thread; - java_thread.reset(new android::JavaHandlerThreadForTesting( - "JavaHandlerThreadForTesting from AbortDontRunMoreTasks", - &test_done_event)); + std::unique_ptr<android::JavaHandlerThread> java_thread; + if (init_java_first) { + java_thread = + android::JavaHandlerThreadForTesting::CreateJavaFirst(&test_done_event); + } else { + java_thread = android::JavaHandlerThreadForTesting::Create( + "JavaHandlerThreadForTesting from AbortDontRunMoreTasks", + &test_done_event); + } java_thread->Start(); if (delayed) { @@ -121,10 +125,19 @@ void RunTest_AbortDontRunMoreTasks(bool delayed) { } TEST(MessageLoopTest, JavaExceptionAbort) { - RunTest_AbortDontRunMoreTasks(false); + constexpr bool delayed = false; + constexpr bool init_java_first = false; + RunTest_AbortDontRunMoreTasks(delayed, init_java_first); } TEST(MessageLoopTest, DelayedJavaExceptionAbort) { - RunTest_AbortDontRunMoreTasks(true); + constexpr bool delayed = true; + constexpr bool init_java_first = false; + RunTest_AbortDontRunMoreTasks(delayed, init_java_first); +} +TEST(MessageLoopTest, JavaExceptionAbortInitJavaFirst) { + constexpr bool delayed = false; + constexpr bool init_java_first = true; + RunTest_AbortDontRunMoreTasks(delayed, init_java_first); } #endif // defined(OS_ANDROID) diff --git a/base/message_loop/message_pump_glib_unittest.cc b/base/message_loop/message_pump_glib_unittest.cc index a89ccb9365..607d3c93d6 100644 --- a/base/message_loop/message_pump_glib_unittest.cc +++ b/base/message_loop/message_pump_glib_unittest.cc @@ -13,6 +13,7 @@ #include "base/bind.h" #include "base/bind_helpers.h" #include "base/callback.h" +#include "base/macros.h" #include "base/memory/ref_counted.h" #include "base/message_loop/message_loop.h" #include "base/run_loop.h" diff --git a/base/message_loop/message_pump_libevent.cc b/base/message_loop/message_pump_libevent.cc index 1cbde8ac18..48cb98a330 100644 --- a/base/message_loop/message_pump_libevent.cc +++ b/base/message_loop/message_pump_libevent.cc @@ -13,7 +13,6 @@ #include "base/compiler_specific.h" #include "base/files/file_util.h" #include "base/logging.h" -#include "base/observer_list.h" #include "base/posix/eintr_wrapper.h" #include "base/third_party/libevent/event.h" #include "base/time/time.h" |