| 761 | } |
| 762 | |
| 763 | void test_random_cancel(bool use_pthread) { |
| 764 | bthread::ExecutionQueueId<AddTask> queue_id = { 0 }; |
| 765 | AddMeta m; |
| 766 | m.sum = 0; |
| 767 | m.expected.store(0); |
| 768 | m.succ_times.store(0); |
| 769 | m.fail_times.store(0); |
| 770 | m.race_times.store(0); |
| 771 | ASSERT_EQ(0, bthread::execution_queue_start(&queue_id, NULL, |
| 772 | add_with_cancel, &m)); |
| 773 | int64_t expected = 0; |
| 774 | for (int i = 0; i < 100000; ++i) { |
| 775 | bthread::TaskHandle h; |
| 776 | AddTask t; |
| 777 | t.value = i; |
| 778 | t.cancel_task = false; |
| 779 | ASSERT_EQ(0, bthread::execution_queue_execute(queue_id, t, NULL, &h)); |
| 780 | const int r = butil::fast_rand_less_than(4); |
| 781 | expected += i; |
| 782 | if (r == 0) { |
| 783 | if (bthread::execution_queue_cancel(h) == 0) { |
| 784 | expected -= i; |
| 785 | } |
| 786 | } else if (r == 1) { |
| 787 | t.cancel_task = true; |
| 788 | t.cancel_value = i; |
| 789 | t.handle = h; |
| 790 | ASSERT_EQ(0, bthread::execution_queue_execute(queue_id, t, NULL)); |
| 791 | } else if (r == 2) { |
| 792 | t.cancel_task = true; |
| 793 | t.cancel_value = i; |
| 794 | t.handle = h; |
| 795 | ASSERT_EQ(0, bthread::execution_queue_execute( |
| 796 | queue_id, t, &bthread::TASK_OPTIONS_URGENT)); |
| 797 | } else { |
| 798 | // do nothing; |
| 799 | } |
| 800 | } |
| 801 | m.expected.fetch_add(expected); |
| 802 | ASSERT_EQ(0, bthread::execution_queue_stop(queue_id)); |
| 803 | ASSERT_EQ(0, bthread::execution_queue_join(queue_id)); |
| 804 | ASSERT_EQ(m.sum, m.expected.load()); |
| 805 | LOG(INFO) << "sum=" << m.sum << " race_times=" << m.race_times |
| 806 | << " succ_times=" << m.succ_times |
| 807 | << " fail_times=" << m.fail_times; |
| 808 | } |
| 809 | |
| 810 | TEST_F(ExecutionQueueTest, random_cancel) { |
| 811 | for (int i = 0; i < 2; ++i) { |
no test coverage detected