| 271 | |
| 272 | template <typename T> |
| 273 | bool ThreadsafeQueue<T>::push(T new_value) { |
| 274 | if (shutdown_) return false; // atomic, no lock needed. |
| 275 | std::shared_ptr<T> data(std::make_shared<T>(std::move(new_value))); |
| 276 | std::unique_lock<std::mutex> lk(mutex_); |
| 277 | data_queue_.push(data); |
| 278 | size_t queue_size = data_queue_.size(); |
| 279 | lk.unlock(); // Unlock before notify. |
| 280 | data_cond_.notify_one(); |
| 281 | // Thread-safe so doesn't need external mutex. |
| 282 | if (queue_size_stats_) queue_size_stats_->AddSample(queue_size); |
| 283 | VLOG_IF(1, queue_size > 1u) << "Queue with id: " << queue_id_ << " is getting full, size: " << queue_size; |
| 284 | return true; |
| 285 | } |
| 286 | |
| 287 | template <typename T> |
| 288 | bool ThreadsafeQueue<T>::pushBlockingIfFull(T new_value, size_t max_queue_size) { |
no test coverage detected