| 85 | |
| 86 | |
| 87 | TEST(WSQTest, sanity) { |
| 88 | bthread::WorkStealingQueue<value_type> q; |
| 89 | ASSERT_EQ(0, q.init(CAP)); |
| 90 | pthread_t rth[8]; |
| 91 | pthread_t wth, pop_th; |
| 92 | for (size_t i = 0; i < ARRAY_SIZE(rth); ++i) { |
| 93 | ASSERT_EQ(0, pthread_create(&rth[i], NULL, steal_thread, &q)); |
| 94 | } |
| 95 | ASSERT_EQ(0, pthread_create(&wth, NULL, push_thread, &q)); |
| 96 | ASSERT_EQ(0, pthread_create(&pop_th, NULL, pop_thread, &q)); |
| 97 | |
| 98 | std::vector<value_type> values; |
| 99 | values.reserve(N); |
| 100 | size_t nstolen = 0, npopped = 0; |
| 101 | for (size_t i = 0; i < ARRAY_SIZE(rth); ++i) { |
| 102 | std::vector<value_type>* res = NULL; |
| 103 | pthread_join(rth[i], (void**)&res); |
| 104 | for (size_t j = 0; j < res->size(); ++j, ++nstolen) { |
| 105 | values.push_back((*res)[j]); |
| 106 | } |
| 107 | delete res; |
| 108 | } |
| 109 | pthread_join(wth, NULL); |
| 110 | std::vector<value_type>* res = NULL; |
| 111 | pthread_join(pop_th, (void**)&res); |
| 112 | for (size_t j = 0; j < res->size(); ++j, ++npopped) { |
| 113 | values.push_back((*res)[j]); |
| 114 | } |
| 115 | delete res; |
| 116 | |
| 117 | value_type val; |
| 118 | while (q.pop(&val)) { |
| 119 | values.push_back(val); |
| 120 | } |
| 121 | |
| 122 | std::sort(values.begin(), values.end()); |
| 123 | values.resize(std::unique(values.begin(), values.end()) - values.begin()); |
| 124 | |
| 125 | ASSERT_EQ(N, values.size()); |
| 126 | for (size_t i = 0; i < N; ++i) { |
| 127 | ASSERT_EQ(i, values[i]); |
| 128 | } |
| 129 | std::cout << "stolen=" << nstolen |
| 130 | << " popped=" << npopped |
| 131 | << " left=" << (N - nstolen - npopped) << std::endl; |
| 132 | } |
| 133 | } // namespace |