#ifndef HV_TASK_QUEUE_H_ #define HV_TASK_QUEUE_H_ #include #include #include #include "htask.h" class TaskQueue { public: TaskQueue(int size = 0) : max_size(size) { } std::shared_ptr Get() { std::lock_guard locker(mutex_); std::shared_ptr pTask = NULL; if (task_queue_.size() == 0) { // task_queue empty return pTask; } pTask = task_queue_.front(); // note: remove after get task_queue_.pop_front(); return pTask; } bool Add(std::shared_ptr pTask) { std::lock_guard locker(mutex_); if (max_size != 0 && task_queue_.size() >= max_size) { // task_queue full return false; } task_queue_.push_back(pTask); return true; } bool AddAndWait(std::shared_ptr pTask) { std::unique_lock locker(mutex_); if (max_size != 0 && task_queue_.size() >= max_size) { // task_queue full return false; } task_queue_.push_back(pTask); if (pTask->Wait(locker) == ERR_TASK_TIMEOUT) { // remove for (auto iter = task_queue_.begin(); iter != task_queue_.end(); ++iter) { if (*iter == pTask) { task_queue_.erase(iter); return false; } } } return true; } bool Remove(std::shared_ptr pTask) { std::lock_guard locker(mutex_); for (auto iter = task_queue_.begin(); iter != task_queue_.end(); ++iter) { if (*iter == pTask) { task_queue_.erase(iter); return true; } } return false; } void RemoveAll() { std::lock_guard locker(mutex_); task_queue_.clear(); } public: size_t max_size; protected: std::list> task_queue_; std::mutex mutex_; }; #endif // HV_TASK_QUEUE_H_