|  | @@ -1,85 +0,0 @@
 | 
	
		
			
				|  |  | -/*
 | 
	
		
			
				|  |  | - *
 | 
	
		
			
				|  |  | - * Copyright 2015, Google Inc.
 | 
	
		
			
				|  |  | - * All rights reserved.
 | 
	
		
			
				|  |  | - *
 | 
	
		
			
				|  |  | - * Redistribution and use in source and binary forms, with or without
 | 
	
		
			
				|  |  | - * modification, are permitted provided that the following conditions are
 | 
	
		
			
				|  |  | - * met:
 | 
	
		
			
				|  |  | - *
 | 
	
		
			
				|  |  | - *     * Redistributions of source code must retain the above copyright
 | 
	
		
			
				|  |  | - * notice, this list of conditions and the following disclaimer.
 | 
	
		
			
				|  |  | - *     * Redistributions in binary form must reproduce the above
 | 
	
		
			
				|  |  | - * copyright notice, this list of conditions and the following disclaimer
 | 
	
		
			
				|  |  | - * in the documentation and/or other materials provided with the
 | 
	
		
			
				|  |  | - * distribution.
 | 
	
		
			
				|  |  | - *     * Neither the name of Google Inc. nor the names of its
 | 
	
		
			
				|  |  | - * contributors may be used to endorse or promote products derived from
 | 
	
		
			
				|  |  | - * this software without specific prior written permission.
 | 
	
		
			
				|  |  | - *
 | 
	
		
			
				|  |  | - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 | 
	
		
			
				|  |  | - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 | 
	
		
			
				|  |  | - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 | 
	
		
			
				|  |  | - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 | 
	
		
			
				|  |  | - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 | 
	
		
			
				|  |  | - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 | 
	
		
			
				|  |  | - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 | 
	
		
			
				|  |  | - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 | 
	
		
			
				|  |  | - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
	
		
			
				|  |  | - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | 
	
		
			
				|  |  | - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
	
		
			
				|  |  | - *
 | 
	
		
			
				|  |  | - */
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -#include <grpc++/impl/sync.h>
 | 
	
		
			
				|  |  | -#include <grpc++/impl/thd.h>
 | 
	
		
			
				|  |  | -#include "src/cpp/server/fixed_size_thread_pool.h"
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -namespace grpc {
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -void FixedSizeThreadPool::ThreadFunc() {
 | 
	
		
			
				|  |  | -  for (;;) {
 | 
	
		
			
				|  |  | -    // Wait until work is available or we are shutting down.
 | 
	
		
			
				|  |  | -    grpc::unique_lock<grpc::mutex> lock(mu_);
 | 
	
		
			
				|  |  | -    if (!shutdown_ && callbacks_.empty()) {
 | 
	
		
			
				|  |  | -      cv_.wait(lock);
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -    // 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;
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -FixedSizeThreadPool::FixedSizeThreadPool(int num_threads) : shutdown_(false) {
 | 
	
		
			
				|  |  | -  for (int i = 0; i < num_threads; i++) {
 | 
	
		
			
				|  |  | -    threads_.push_back(
 | 
	
		
			
				|  |  | -        new grpc::thread(&FixedSizeThreadPool::ThreadFunc, this));
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -FixedSizeThreadPool::~FixedSizeThreadPool() {
 | 
	
		
			
				|  |  | -  {
 | 
	
		
			
				|  |  | -    grpc::lock_guard<grpc::mutex> lock(mu_);
 | 
	
		
			
				|  |  | -    shutdown_ = true;
 | 
	
		
			
				|  |  | -    cv_.notify_all();
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -  for (auto t = threads_.begin(); t != threads_.end(); t++) {
 | 
	
		
			
				|  |  | -    (*t)->join();
 | 
	
		
			
				|  |  | -    delete *t;
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -void FixedSizeThreadPool::Add(const std::function<void()>& callback) {
 | 
	
		
			
				|  |  | -  grpc::lock_guard<grpc::mutex> lock(mu_);
 | 
	
		
			
				|  |  | -  callbacks_.push(callback);
 | 
	
		
			
				|  |  | -  cv_.notify_one();
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -}  // namespace grpc
 |