aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar Vijay Pai <vpai@google.com>2015-03-25 14:44:01 -0700
committerGravatar Vijay Pai <vpai@google.com>2015-03-25 14:44:01 -0700
commit335b97df8c610e99befea20ef67ce2f8866eef24 (patch)
treeb687e45c807eb1d8f1d5ea9f6abcc148d77adb76 /src
parent5d5b1d8c8ec4c578f72a12f5b81f705764cdf804 (diff)
Revert "Remove lambda expression to support older compilers"
Diffstat (limited to 'src')
-rw-r--r--src/cpp/server/thread_pool.cc41
-rw-r--r--src/cpp/server/thread_pool.h2
2 files changed, 20 insertions, 23 deletions
diff --git a/src/cpp/server/thread_pool.cc b/src/cpp/server/thread_pool.cc
index 10dceec836..d3013b806c 100644
--- a/src/cpp/server/thread_pool.cc
+++ b/src/cpp/server/thread_pool.cc
@@ -35,29 +35,28 @@
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(&ThreadPool::ThreadFunc, this));
+ 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;
+ }
+ }
+ }));
}
}
diff --git a/src/cpp/server/thread_pool.h b/src/cpp/server/thread_pool.h
index 41e2009ff1..6225d82a0b 100644
--- a/src/cpp/server/thread_pool.h
+++ b/src/cpp/server/thread_pool.h
@@ -58,8 +58,6 @@ class ThreadPool GRPC_FINAL : public ThreadPoolInterface {
bool shutdown_;
std::queue<std::function<void()>> callbacks_;
std::vector<std::thread> threads_;
-
- void ThreadFunc();
};
} // namespace grpc