diff --git a/test/cpp/qps/client_async.cc b/test/cpp/qps/client_async.cc index d120a8aaec80e0e3ed35e8e190483a058b28f34e..8c8d927d15fa5355e0cb56872634dc7f190d0bce 100644 --- a/test/cpp/qps/client_async.cc +++ b/test/cpp/qps/client_async.cc @@ -168,7 +168,7 @@ class AsyncClient : public Client { if (!closed_loop_) { rpc_deadlines_.emplace_back(); next_channel_.push_back(i % channel_count_); - issue_allowed_.push_back(true); + issue_allowed_.emplace_back(true); grpc_time next_issue; NextIssueTime(i, &next_issue); @@ -307,11 +307,20 @@ class AsyncClient : public Client { } private: + class boolean { // exists only to avoid data-race on vector<bool> + public: + boolean(): val_(false) {} + boolean(bool b): val_(b) {} + operator bool() const {return val_;} + boolean& operator=(bool b) {val_=b; return *this;} + private: + bool val_; + }; std::vector<std::unique_ptr<CompletionQueue>> cli_cqs_; std::vector<deadline_list> rpc_deadlines_; // per thread deadlines std::vector<int> next_channel_; // per thread round-robin channel ctr - std::vector<bool> issue_allowed_; // may this thread attempt to issue + std::vector<boolean> issue_allowed_; // may this thread attempt to issue std::vector<grpc_time> next_issue_; // when should it issue? std::vector<std::mutex> channel_lock_;