|
|
|
@ -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_; |
|
|
|
|