| 547 | }; |
| 548 | |
| 549 | static void ThreadBody(void* v) { |
| 550 | ThreadArg* arg = reinterpret_cast<ThreadArg*>(v); |
| 551 | SharedState* shared = arg->shared; |
| 552 | ThreadState* thread = arg->thread; |
| 553 | { |
| 554 | MutexLock l(&shared->mu); |
| 555 | shared->num_initialized++; |
| 556 | if (shared->num_initialized >= shared->total) { |
| 557 | shared->cv.SignalAll(); |
| 558 | } |
| 559 | while (!shared->start) { |
| 560 | shared->cv.Wait(); |
| 561 | } |
| 562 | } |
| 563 | |
| 564 | thread->stats.Start(); |
| 565 | (arg->bm->*(arg->method))(thread); |
| 566 | thread->stats.Stop(); |
| 567 | |
| 568 | { |
| 569 | MutexLock l(&shared->mu); |
| 570 | shared->num_done++; |
| 571 | if (shared->num_done >= shared->total) { |
| 572 | shared->cv.SignalAll(); |
| 573 | } |
| 574 | } |
| 575 | } |
| 576 | |
| 577 | void RunBenchmark(int n, Slice name, |
| 578 | void (Benchmark::*method)(ThreadState*)) { |