From e2980cd0b32e3a3cb971b9d77bee4a53474c6cbb Mon Sep 17 00:00:00 2001
From: Vijay Pai <vpai@google.com>
Date: Wed, 1 Jul 2015 09:38:20 -0700
Subject: [PATCH] Eliminate data-race caused by specialization in vector<bool>

---
 test/cpp/qps/client_async.cc | 13 +++++++++++--
 1 file changed, 11 insertions(+), 2 deletions(-)

diff --git a/test/cpp/qps/client_async.cc b/test/cpp/qps/client_async.cc
index d120a8aaec..8c8d927d15 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_;
-- 
GitLab