parent
							
								
									6c0356e41d
								
							
						
					
					
						commit
						251e4a8ee5
					
				| @ -0,0 +1,74 @@ | ||||
| /* Copyright (c) 2016 PaddlePaddle Authors. All Rights Reserved.
 | ||||
| 
 | ||||
| Licensed under the Apache License, Version 2.0 (the "License"); | ||||
| you may not use this file except in compliance with the License. | ||||
| You may obtain a copy of the License at | ||||
| 
 | ||||
|     http://www.apache.org/licenses/LICENSE-2.0
 | ||||
| 
 | ||||
| Unless required by applicable law or agreed to in writing, software | ||||
| distributed under the License is distributed on an "AS IS" BASIS, | ||||
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
| See the License for the specific language governing permissions and | ||||
| limitations under the License. */ | ||||
| 
 | ||||
| #pragma once | ||||
| 
 | ||||
| #include <condition_variable>  // NOLINT | ||||
| #include <deque> | ||||
| #include <mutex>  // NOLINT | ||||
| #include <utility> | ||||
| 
 | ||||
| namespace paddle { | ||||
| namespace framework { | ||||
| 
 | ||||
| template <typename T> | ||||
| class BlockingQueue { | ||||
|  public: | ||||
|   void Push(const T &item) { | ||||
|     { | ||||
|       std::lock_guard<std::mutex> g(mutex_); | ||||
|       q_.emplace_back(item); | ||||
|     } | ||||
|     cv_.notify_one(); | ||||
|   } | ||||
| 
 | ||||
|   template <typename U> | ||||
|   void Extend(const U &items) { | ||||
|     { | ||||
|       std::lock_guard<std::mutex> g(mutex_); | ||||
|       for (auto &item : items) { | ||||
|         q_.emplace_back(item); | ||||
|       } | ||||
|     } | ||||
|     cv_.notify_all(); | ||||
|   } | ||||
| 
 | ||||
|   std::deque<T> PopAll(size_t ms, bool *timeout) { | ||||
|     auto time = | ||||
|         std::chrono::system_clock::now() + std::chrono::milliseconds(ms); | ||||
|     std::unique_lock<std::mutex> lock(mutex_); | ||||
|     *timeout = !cv_.wait_until(lock, time, [this] { return !q_.empty(); }); | ||||
|     std::deque<T> ret; | ||||
|     if (!*timeout) { | ||||
|       std::swap(ret, q_); | ||||
|     } | ||||
|     return ret; | ||||
|   } | ||||
| 
 | ||||
|   T Pop() { | ||||
|     std::unique_lock<std::mutex> lock(mutex_); | ||||
|     cv_.wait(lock, [=] { return !q_.empty(); }); | ||||
|     T rc(std::move(q_.front())); | ||||
|     q_.pop_front(); | ||||
|     return rc; | ||||
|   } | ||||
| 
 | ||||
|  private: | ||||
|   std::mutex mutex_; | ||||
|   std::condition_variable cv_; | ||||
|   std::deque<T> q_; | ||||
| }; | ||||
| 
 | ||||
| }  // namespace framework
 | ||||
| }  // namespace paddle
 | ||||
| @ -1,52 +0,0 @@ | ||||
| /* Copyright (c) 2016 PaddlePaddle Authors. All Rights Reserved.
 | ||||
| 
 | ||||
| Licensed under the Apache License, Version 2.0 (the "License"); | ||||
| you may not use this file except in compliance with the License. | ||||
| You may obtain a copy of the License at | ||||
| 
 | ||||
|     http://www.apache.org/licenses/LICENSE-2.0
 | ||||
| 
 | ||||
| Unless required by applicable law or agreed to in writing, software | ||||
| distributed under the License is distributed on an "AS IS" BASIS, | ||||
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
| See the License for the specific language governing permissions and | ||||
| limitations under the License. */ | ||||
| 
 | ||||
| #pragma once | ||||
| 
 | ||||
| #include <condition_variable>  // NOLINT | ||||
| #include <deque> | ||||
| #include <mutex>  // NOLINT | ||||
| 
 | ||||
| namespace paddle { | ||||
| namespace operators { | ||||
| namespace detail { | ||||
| 
 | ||||
| template <typename T> | ||||
| class SimpleBlockQueue { | ||||
|  private: | ||||
|   std::mutex mutex_; | ||||
|   std::condition_variable condition_; | ||||
|   std::deque<T> queue_; | ||||
| 
 | ||||
|  public: | ||||
|   void Push(T const& value) { | ||||
|     { | ||||
|       std::unique_lock<std::mutex> lock(this->mutex_); | ||||
|       queue_.push_front(value); | ||||
|     } | ||||
|     this->condition_.notify_one(); | ||||
|   } | ||||
| 
 | ||||
|   T Pop() { | ||||
|     std::unique_lock<std::mutex> lock(this->mutex_); | ||||
|     this->condition_.wait(lock, [=] { return !this->queue_.empty(); }); | ||||
|     T rc(std::move(this->queue_.back())); | ||||
|     this->queue_.pop_back(); | ||||
|     return rc; | ||||
|   } | ||||
| }; | ||||
| 
 | ||||
| }  // namespace detail
 | ||||
| }  // namespace operators
 | ||||
| }  // namespace paddle
 | ||||
					Loading…
					
					
				
		Reference in new issue