| 105 | |
| 106 | |
| 107 | bool run_test(uint64_t seed, int iterations, test_type& out_type, const char*& out_failReason) |
| 108 | { |
| 109 | bool result = true; |
| 110 | RNG_t baseRng((unsigned int)seed); |
| 111 | |
| 112 | std::uniform_int_distribution<int> randTest(0, TEST_TYPE_COUNT - 1); |
| 113 | std::uniform_int_distribution<int> randInitialSize(0, 70); |
| 114 | |
| 115 | auto type = static_cast<test_type>(randTest(baseRng)); |
| 116 | out_type = type; |
| 117 | for (int iteration = 0; iteration != iterations; ++iteration) { |
| 118 | RNG_t rng(baseRng); |
| 119 | |
| 120 | std::atomic<bool> failed(false); |
| 121 | std::atomic<const char*> failReason; |
| 122 | failReason = nullptr; |
| 123 | SystemTime startTime = getSystemTime(); |
| 124 | |
| 125 | switch (type) { |
| 126 | case multithread_produce: |
| 127 | { |
| 128 | const int countIncrement = std::uniform_int_distribution<int>(1, 1000)(rng); |
| 129 | int count = std::uniform_int_distribution<int>(0, 500)(rng) * countIncrement; |
| 130 | int prodCount = std::uniform_int_distribution<int>(0, 6)(rng); |
| 131 | bool useConsumerToken = static_cast<bool>(std::uniform_int_distribution<int>(0, 1)(rng)); |
| 132 | |
| 133 | ConcurrentQueue<int, FuzzTraits> q(randInitialSize(rng)); |
| 134 | |
| 135 | std::vector<SimpleThread> producers(prodCount); |
| 136 | std::vector<bool> useProducerToken(prodCount); |
| 137 | for (int i = 0; i != prodCount; ++i) { |
| 138 | useProducerToken[i] = static_cast<bool>(std::uniform_int_distribution<int>(0, 1)(rng)); |
| 139 | producers[i] = SimpleThread([&](int i) { |
| 140 | ProducerToken t(q); |
| 141 | for (int j = 0; j != count && !failed.load(std::memory_order_relaxed); j += countIncrement) { |
| 142 | if (useProducerToken[i]) { |
| 143 | for (int k = 0; k != countIncrement; ++k) { |
| 144 | ASSERT_OR_FAIL_THREAD(q.enqueue(t, (i << 24) | (k + j))); |
| 145 | } |
| 146 | } |
| 147 | else { |
| 148 | for (int k = 0; k != countIncrement; ++k) { |
| 149 | ASSERT_OR_FAIL_THREAD(q.enqueue((i << 24) | (k + j))); |
| 150 | } |
| 151 | } |
| 152 | FAIL_IF_THREAD_TIMEOUT(); |
| 153 | } |
| 154 | }, i); |
| 155 | } |
| 156 | |
| 157 | SimpleThread consumer([&]() { |
| 158 | int item; |
| 159 | std::vector<int> lastItems(prodCount); |
| 160 | ConsumerToken t(q); |
| 161 | |
| 162 | for (int i = 0; i != prodCount; ++i) { |
| 163 | lastItems[i] = -1; |
| 164 | } |
no test coverage detected