| 292 | } |
| 293 | |
| 294 | static int RunInMultipleProcesses(const std::vector<std::string> &Args, |
| 295 | unsigned NumWorkers, unsigned NumJobs) { |
| 296 | std::atomic<unsigned> Counter(0); |
| 297 | std::atomic<bool> HasErrors(false); |
| 298 | Command Cmd(Args); |
| 299 | Cmd.removeFlag("jobs"); |
| 300 | Cmd.removeFlag("workers"); |
| 301 | std::vector<std::thread> V; |
| 302 | std::thread Pulse(PulseThread); |
| 303 | Pulse.detach(); |
| 304 | V.resize(NumWorkers); |
| 305 | for (unsigned i = 0; i < NumWorkers; i++) { |
| 306 | V[i] = std::thread(WorkerThread, std::ref(Cmd), &Counter, NumJobs, |
| 307 | &HasErrors); |
| 308 | SetThreadName(V[i], "FuzzerWorker"); |
| 309 | } |
| 310 | for (auto &T : V) |
| 311 | T.join(); |
| 312 | return HasErrors ? 1 : 0; |
| 313 | } |
| 314 | |
| 315 | static void RssThread(Fuzzer *F, size_t RssLimitMb) { |
| 316 | while (true) { |
no test coverage detected