Skip to content

Commit

Permalink
Remove lambda expression to support older compilers
Browse files Browse the repository at this point in the history
  • Loading branch information
vjpai committed Mar 25, 2015
1 parent 3ff350c commit 5d5b1d8
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 20 deletions.
41 changes: 21 additions & 20 deletions src/cpp/server/thread_pool.cc
Original file line number Diff line number Diff line change
Expand Up @@ -35,28 +35,29 @@

namespace grpc {

#ifdef __GNUC__
#if (__GNUC__ * 100 + __GNUC_MINOR__ < 406)
#define GRPC_NO_NULLPTR
#endif
#endif

#ifdef GRPC_NO_NULLPTR
#include <memory>
const class {
public:
template <class T> operator T*() const {return static_cast<T *>(0);}
template <class T> operator std::unique_ptr<T>() const {
return std::unique_ptr<T>(static_cast<T *>(0));
}
operator bool() const {return false;}
private:
void operator&() const = delete;
} nullptr = {};
#endif

ThreadPool::ThreadPool(int num_threads) : shutdown_(false) {
for (int i = 0; i < num_threads; i++) {
threads_.push_back(std::thread([this]() {
for (;;) {
// Wait until work is available or we are shutting down.
auto have_work = [this]() { return shutdown_ || !callbacks_.empty(); };
std::unique_lock<std::mutex> lock(mu_);
if (!have_work()) {
cv_.wait(lock, have_work);
}
// Drain callbacks before considering shutdown to ensure all work
// gets completed.
if (!callbacks_.empty()) {
auto cb = callbacks_.front();
callbacks_.pop();
lock.unlock();
cb();
} else if (shutdown_) {
return;
}
}
}));
threads_.push_back(std::thread(&ThreadPool::ThreadFunc, this));
}
}

Expand Down
2 changes: 2 additions & 0 deletions src/cpp/server/thread_pool.h
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,8 @@ class ThreadPool GRPC_FINAL : public ThreadPoolInterface {
bool shutdown_;
std::queue<std::function<void()>> callbacks_;
std::vector<std::thread> threads_;

void ThreadFunc();
};

} // namespace grpc
Expand Down

0 comments on commit 5d5b1d8

Please sign in to comment.