OLD | NEW |
---|---|
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include <vector> | 5 #include <vector> |
6 | 6 |
7 #include "base/eintr_wrapper.h" | 7 #include "base/eintr_wrapper.h" |
8 #include "base/logging.h" | 8 #include "base/logging.h" |
9 #include "base/message_loop.h" | 9 #include "base/message_loop.h" |
10 #include "base/ref_counted.h" | 10 #include "base/ref_counted.h" |
(...skipping 750 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
761 new RecursiveTask(depth_ - 1, order(), cookie(), is_reentrant_)); | 761 new RecursiveTask(depth_ - 1, order(), cookie(), is_reentrant_)); |
762 } | 762 } |
763 RunEnd(); | 763 RunEnd(); |
764 } | 764 } |
765 | 765 |
766 private: | 766 private: |
767 int depth_; | 767 int depth_; |
768 bool is_reentrant_; | 768 bool is_reentrant_; |
769 }; | 769 }; |
770 | 770 |
771 class RecursiveSlowTask : public RecursiveTask { | |
772 public: | |
773 RecursiveSlowTask(int depth, TaskList* order, int cookie, bool is_reentrant) | |
774 : RecursiveTask(depth, order, cookie, is_reentrant) { | |
775 } | |
776 | |
777 virtual void Run() { | |
778 RecursiveTask::Run(); | |
779 PlatformThread::Sleep(10); // milliseconds | |
darin (slow to review)
2011/02/16 23:58:02
nit: two spaces before '//' for inline comments
| |
780 } | |
781 }; | |
782 | |
771 class QuitTask : public OrderedTasks { | 783 class QuitTask : public OrderedTasks { |
772 public: | 784 public: |
773 QuitTask(TaskList* order, int cookie) | 785 QuitTask(TaskList* order, int cookie) |
774 : OrderedTasks(order, QUITMESSAGELOOP, cookie) { | 786 : OrderedTasks(order, QUITMESSAGELOOP, cookie) { |
775 } | 787 } |
776 | 788 |
777 virtual void Run() { | 789 virtual void Run() { |
778 RunStart(); | 790 RunStart(); |
779 MessageLoop::current()->Quit(); | 791 MessageLoop::current()->Quit(); |
780 RunEnd(); | 792 RunEnd(); |
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
886 EXPECT_EQ(order[ 6], TaskItem(RECURSIVE, 1, true)); | 898 EXPECT_EQ(order[ 6], TaskItem(RECURSIVE, 1, true)); |
887 EXPECT_EQ(order[ 7], TaskItem(RECURSIVE, 1, false)); | 899 EXPECT_EQ(order[ 7], TaskItem(RECURSIVE, 1, false)); |
888 EXPECT_EQ(order[ 8], TaskItem(RECURSIVE, 2, true)); | 900 EXPECT_EQ(order[ 8], TaskItem(RECURSIVE, 2, true)); |
889 EXPECT_EQ(order[ 9], TaskItem(RECURSIVE, 2, false)); | 901 EXPECT_EQ(order[ 9], TaskItem(RECURSIVE, 2, false)); |
890 EXPECT_EQ(order[10], TaskItem(RECURSIVE, 1, true)); | 902 EXPECT_EQ(order[10], TaskItem(RECURSIVE, 1, true)); |
891 EXPECT_EQ(order[11], TaskItem(RECURSIVE, 1, false)); | 903 EXPECT_EQ(order[11], TaskItem(RECURSIVE, 1, false)); |
892 EXPECT_EQ(order[12], TaskItem(RECURSIVE, 2, true)); | 904 EXPECT_EQ(order[12], TaskItem(RECURSIVE, 2, true)); |
893 EXPECT_EQ(order[13], TaskItem(RECURSIVE, 2, false)); | 905 EXPECT_EQ(order[13], TaskItem(RECURSIVE, 2, false)); |
894 } | 906 } |
895 | 907 |
908 void RunTest_RecursiveDenial3(MessageLoop::Type message_loop_type) { | |
909 MessageLoop loop(message_loop_type); | |
910 | |
911 EXPECT_TRUE(MessageLoop::current()->NestableTasksAllowed()); | |
912 TaskList order; | |
913 MessageLoop::current()->PostTask(FROM_HERE, | |
914 new RecursiveSlowTask(2, &order, 1, false)); | |
915 MessageLoop::current()->PostTask(FROM_HERE, | |
916 new RecursiveSlowTask(2, &order, 2, false)); | |
917 MessageLoop::current()->PostDelayedTask(FROM_HERE, | |
918 new OrderedTasks(&order, 3), 5); | |
919 MessageLoop::current()->PostDelayedTask(FROM_HERE, | |
920 new QuitTask(&order, 4), 5); | |
921 | |
922 MessageLoop::current()->Run(); | |
923 | |
924 for (size_t i=0; i<order.size(); ++i) { | |
925 LOG(WARNING) << "item " << i << " is " << order[i]; | |
926 } | |
927 | |
928 LOG(WARNING) << "message type " << message_loop_type; | |
929 | |
930 // FIFO order. | |
931 ASSERT_EQ(16U, order.size()); | |
932 EXPECT_EQ(order[ 0], TaskItem(RECURSIVE, 1, true)); | |
933 EXPECT_EQ(order[ 1], TaskItem(RECURSIVE, 1, false)); | |
934 EXPECT_EQ(order[ 2], TaskItem(RECURSIVE, 2, true)); | |
935 EXPECT_EQ(order[ 3], TaskItem(RECURSIVE, 2, false)); | |
936 EXPECT_EQ(order[ 4], TaskItem(RECURSIVE, 1, true)); | |
937 EXPECT_EQ(order[ 5], TaskItem(RECURSIVE, 1, false)); | |
938 EXPECT_EQ(order[ 6], TaskItem(ORDERERD, 3, true)); | |
939 EXPECT_EQ(order[ 7], TaskItem(ORDERERD, 3, false)); | |
940 EXPECT_EQ(order[ 8], TaskItem(RECURSIVE, 2, true)); | |
941 EXPECT_EQ(order[ 9], TaskItem(RECURSIVE, 2, false)); | |
942 EXPECT_EQ(order[10], TaskItem(QUITMESSAGELOOP, 4, true)); | |
943 EXPECT_EQ(order[11], TaskItem(QUITMESSAGELOOP, 4, false)); | |
944 EXPECT_EQ(order[12], TaskItem(RECURSIVE, 1, true)); | |
945 EXPECT_EQ(order[13], TaskItem(RECURSIVE, 1, false)); | |
946 EXPECT_EQ(order[14], TaskItem(RECURSIVE, 2, true)); | |
947 EXPECT_EQ(order[15], TaskItem(RECURSIVE, 2, false)); | |
948 } | |
949 | |
950 | |
896 void RunTest_RecursiveSupport1(MessageLoop::Type message_loop_type) { | 951 void RunTest_RecursiveSupport1(MessageLoop::Type message_loop_type) { |
897 MessageLoop loop(message_loop_type); | 952 MessageLoop loop(message_loop_type); |
898 | 953 |
899 TaskList order; | 954 TaskList order; |
900 MessageLoop::current()->PostTask(FROM_HERE, | 955 MessageLoop::current()->PostTask(FROM_HERE, |
901 new RecursiveTask(2, &order, 1, true)); | 956 new RecursiveTask(2, &order, 1, true)); |
902 MessageLoop::current()->PostTask(FROM_HERE, | 957 MessageLoop::current()->PostTask(FROM_HERE, |
903 new RecursiveTask(2, &order, 2, true)); | 958 new RecursiveTask(2, &order, 2, true)); |
904 MessageLoop::current()->PostTask(FROM_HERE, | 959 MessageLoop::current()->PostTask(FROM_HERE, |
905 new QuitTask(&order, 3)); | 960 new QuitTask(&order, 3)); |
(...skipping 513 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1419 RunTest_Nesting(MessageLoop::TYPE_UI); | 1474 RunTest_Nesting(MessageLoop::TYPE_UI); |
1420 RunTest_Nesting(MessageLoop::TYPE_IO); | 1475 RunTest_Nesting(MessageLoop::TYPE_IO); |
1421 } | 1476 } |
1422 | 1477 |
1423 TEST(MessageLoopTest, RecursiveDenial1) { | 1478 TEST(MessageLoopTest, RecursiveDenial1) { |
1424 RunTest_RecursiveDenial1(MessageLoop::TYPE_DEFAULT); | 1479 RunTest_RecursiveDenial1(MessageLoop::TYPE_DEFAULT); |
1425 RunTest_RecursiveDenial1(MessageLoop::TYPE_UI); | 1480 RunTest_RecursiveDenial1(MessageLoop::TYPE_UI); |
1426 RunTest_RecursiveDenial1(MessageLoop::TYPE_IO); | 1481 RunTest_RecursiveDenial1(MessageLoop::TYPE_IO); |
1427 } | 1482 } |
1428 | 1483 |
1484 TEST(MessageLoopTest, RecursiveDenial3) { | |
1485 RunTest_RecursiveDenial3(MessageLoop::TYPE_DEFAULT); | |
1486 RunTest_RecursiveDenial3(MessageLoop::TYPE_UI); | |
1487 RunTest_RecursiveDenial3(MessageLoop::TYPE_IO); | |
1488 } | |
1489 | |
1429 TEST(MessageLoopTest, RecursiveSupport1) { | 1490 TEST(MessageLoopTest, RecursiveSupport1) { |
1430 RunTest_RecursiveSupport1(MessageLoop::TYPE_DEFAULT); | 1491 RunTest_RecursiveSupport1(MessageLoop::TYPE_DEFAULT); |
1431 RunTest_RecursiveSupport1(MessageLoop::TYPE_UI); | 1492 RunTest_RecursiveSupport1(MessageLoop::TYPE_UI); |
1432 RunTest_RecursiveSupport1(MessageLoop::TYPE_IO); | 1493 RunTest_RecursiveSupport1(MessageLoop::TYPE_IO); |
1433 } | 1494 } |
1434 | 1495 |
1435 #if defined(OS_WIN) | 1496 #if defined(OS_WIN) |
1436 // This test occasionally hangs http://crbug.com/44567 | 1497 // This test occasionally hangs http://crbug.com/44567 |
1437 TEST(MessageLoopTest, DISABLED_RecursiveDenial2) { | 1498 TEST(MessageLoopTest, DISABLED_RecursiveDenial2) { |
1438 RunTest_RecursiveDenial2(MessageLoop::TYPE_DEFAULT); | 1499 RunTest_RecursiveDenial2(MessageLoop::TYPE_DEFAULT); |
(...skipping 268 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1707 loop->PostDelayedTask( | 1768 loop->PostDelayedTask( |
1708 FROM_HERE, | 1769 FROM_HERE, |
1709 new RunAtDestructionTask(&task_destroyed, &destruction_observer_called), | 1770 new RunAtDestructionTask(&task_destroyed, &destruction_observer_called), |
1710 kDelayMS); | 1771 kDelayMS); |
1711 delete loop; | 1772 delete loop; |
1712 EXPECT_TRUE(observer.task_destroyed_before_message_loop()); | 1773 EXPECT_TRUE(observer.task_destroyed_before_message_loop()); |
1713 // The task should have been destroyed when we deleted the loop. | 1774 // The task should have been destroyed when we deleted the loop. |
1714 EXPECT_TRUE(task_destroyed); | 1775 EXPECT_TRUE(task_destroyed); |
1715 EXPECT_TRUE(destruction_observer_called); | 1776 EXPECT_TRUE(destruction_observer_called); |
1716 } | 1777 } |
OLD | NEW |