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 |
| 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 // FIFO order. |
| 925 ASSERT_EQ(16U, order.size()); |
| 926 EXPECT_EQ(order[ 0], TaskItem(RECURSIVE, 1, true)); |
| 927 EXPECT_EQ(order[ 1], TaskItem(RECURSIVE, 1, false)); |
| 928 EXPECT_EQ(order[ 2], TaskItem(RECURSIVE, 2, true)); |
| 929 EXPECT_EQ(order[ 3], TaskItem(RECURSIVE, 2, false)); |
| 930 EXPECT_EQ(order[ 4], TaskItem(RECURSIVE, 1, true)); |
| 931 EXPECT_EQ(order[ 5], TaskItem(RECURSIVE, 1, false)); |
| 932 EXPECT_EQ(order[ 6], TaskItem(ORDERERD, 3, true)); |
| 933 EXPECT_EQ(order[ 7], TaskItem(ORDERERD, 3, false)); |
| 934 EXPECT_EQ(order[ 8], TaskItem(RECURSIVE, 2, true)); |
| 935 EXPECT_EQ(order[ 9], TaskItem(RECURSIVE, 2, false)); |
| 936 EXPECT_EQ(order[10], TaskItem(QUITMESSAGELOOP, 4, true)); |
| 937 EXPECT_EQ(order[11], TaskItem(QUITMESSAGELOOP, 4, false)); |
| 938 EXPECT_EQ(order[12], TaskItem(RECURSIVE, 1, true)); |
| 939 EXPECT_EQ(order[13], TaskItem(RECURSIVE, 1, false)); |
| 940 EXPECT_EQ(order[14], TaskItem(RECURSIVE, 2, true)); |
| 941 EXPECT_EQ(order[15], TaskItem(RECURSIVE, 2, false)); |
| 942 } |
| 943 |
896 void RunTest_RecursiveSupport1(MessageLoop::Type message_loop_type) { | 944 void RunTest_RecursiveSupport1(MessageLoop::Type message_loop_type) { |
897 MessageLoop loop(message_loop_type); | 945 MessageLoop loop(message_loop_type); |
898 | 946 |
899 TaskList order; | 947 TaskList order; |
900 MessageLoop::current()->PostTask(FROM_HERE, | 948 MessageLoop::current()->PostTask(FROM_HERE, |
901 new RecursiveTask(2, &order, 1, true)); | 949 new RecursiveTask(2, &order, 1, true)); |
902 MessageLoop::current()->PostTask(FROM_HERE, | 950 MessageLoop::current()->PostTask(FROM_HERE, |
903 new RecursiveTask(2, &order, 2, true)); | 951 new RecursiveTask(2, &order, 2, true)); |
904 MessageLoop::current()->PostTask(FROM_HERE, | 952 MessageLoop::current()->PostTask(FROM_HERE, |
905 new QuitTask(&order, 3)); | 953 new QuitTask(&order, 3)); |
(...skipping 513 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1419 RunTest_Nesting(MessageLoop::TYPE_UI); | 1467 RunTest_Nesting(MessageLoop::TYPE_UI); |
1420 RunTest_Nesting(MessageLoop::TYPE_IO); | 1468 RunTest_Nesting(MessageLoop::TYPE_IO); |
1421 } | 1469 } |
1422 | 1470 |
1423 TEST(MessageLoopTest, RecursiveDenial1) { | 1471 TEST(MessageLoopTest, RecursiveDenial1) { |
1424 RunTest_RecursiveDenial1(MessageLoop::TYPE_DEFAULT); | 1472 RunTest_RecursiveDenial1(MessageLoop::TYPE_DEFAULT); |
1425 RunTest_RecursiveDenial1(MessageLoop::TYPE_UI); | 1473 RunTest_RecursiveDenial1(MessageLoop::TYPE_UI); |
1426 RunTest_RecursiveDenial1(MessageLoop::TYPE_IO); | 1474 RunTest_RecursiveDenial1(MessageLoop::TYPE_IO); |
1427 } | 1475 } |
1428 | 1476 |
| 1477 TEST(MessageLoopTest, RecursiveDenial3) { |
| 1478 RunTest_RecursiveDenial3(MessageLoop::TYPE_DEFAULT); |
| 1479 RunTest_RecursiveDenial3(MessageLoop::TYPE_UI); |
| 1480 RunTest_RecursiveDenial3(MessageLoop::TYPE_IO); |
| 1481 } |
| 1482 |
1429 TEST(MessageLoopTest, RecursiveSupport1) { | 1483 TEST(MessageLoopTest, RecursiveSupport1) { |
1430 RunTest_RecursiveSupport1(MessageLoop::TYPE_DEFAULT); | 1484 RunTest_RecursiveSupport1(MessageLoop::TYPE_DEFAULT); |
1431 RunTest_RecursiveSupport1(MessageLoop::TYPE_UI); | 1485 RunTest_RecursiveSupport1(MessageLoop::TYPE_UI); |
1432 RunTest_RecursiveSupport1(MessageLoop::TYPE_IO); | 1486 RunTest_RecursiveSupport1(MessageLoop::TYPE_IO); |
1433 } | 1487 } |
1434 | 1488 |
1435 #if defined(OS_WIN) | 1489 #if defined(OS_WIN) |
1436 // This test occasionally hangs http://crbug.com/44567 | 1490 // This test occasionally hangs http://crbug.com/44567 |
1437 TEST(MessageLoopTest, DISABLED_RecursiveDenial2) { | 1491 TEST(MessageLoopTest, DISABLED_RecursiveDenial2) { |
1438 RunTest_RecursiveDenial2(MessageLoop::TYPE_DEFAULT); | 1492 RunTest_RecursiveDenial2(MessageLoop::TYPE_DEFAULT); |
(...skipping 268 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1707 loop->PostDelayedTask( | 1761 loop->PostDelayedTask( |
1708 FROM_HERE, | 1762 FROM_HERE, |
1709 new RunAtDestructionTask(&task_destroyed, &destruction_observer_called), | 1763 new RunAtDestructionTask(&task_destroyed, &destruction_observer_called), |
1710 kDelayMS); | 1764 kDelayMS); |
1711 delete loop; | 1765 delete loop; |
1712 EXPECT_TRUE(observer.task_destroyed_before_message_loop()); | 1766 EXPECT_TRUE(observer.task_destroyed_before_message_loop()); |
1713 // The task should have been destroyed when we deleted the loop. | 1767 // The task should have been destroyed when we deleted the loop. |
1714 EXPECT_TRUE(task_destroyed); | 1768 EXPECT_TRUE(task_destroyed); |
1715 EXPECT_TRUE(destruction_observer_called); | 1769 EXPECT_TRUE(destruction_observer_called); |
1716 } | 1770 } |
OLD | NEW |