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