task_queue.h 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. #ifndef TASK_QUEUE_H_
  2. #define TASK_QUEUE_H_
  3. #include <memory>
  4. #include <list>
  5. #include <mutex>
  6. #include "htask.h"
  7. class TaskQueue {
  8. public:
  9. TaskQueue(int size = 0) : max_size(size) {
  10. }
  11. std::shared_ptr<HTask> Get() {
  12. std::lock_guard<std::mutex> locker(mutex_);
  13. std::shared_ptr<HTask> pTask = NULL;
  14. if (task_queue_.size() == 0) {
  15. // task_queue empty
  16. return pTask;
  17. }
  18. pTask = task_queue_.front();
  19. // note: remove after get
  20. task_queue_.pop_front();
  21. return pTask;
  22. }
  23. bool Add(std::shared_ptr<HTask> pTask) {
  24. std::lock_guard<std::mutex> locker(mutex_);
  25. if (max_size != 0 && task_queue_.size() >= max_size) {
  26. // task_queue full
  27. return false;
  28. }
  29. task_queue_.push_back(pTask);
  30. return true;
  31. }
  32. bool AddAndWait(std::shared_ptr<HTask> pTask) {
  33. std::unique_lock<std::mutex> locker(mutex_);
  34. if (max_size != 0 && task_queue_.size() >= max_size) {
  35. // task_queue full
  36. return false;
  37. }
  38. task_queue_.push_back(pTask);
  39. if (pTask->Wait(locker) == ERR_TASK_TIMEOUT) {
  40. // remove
  41. for (auto iter = task_queue_.begin(); iter != task_queue_.end(); ++iter) {
  42. if (*iter == pTask) {
  43. task_queue_.erase(iter);
  44. return false;
  45. }
  46. }
  47. }
  48. return true;
  49. }
  50. bool Remove(std::shared_ptr<HTask> pTask) {
  51. std::lock_guard<std::mutex> locker(mutex_);
  52. for (auto iter = task_queue_.begin(); iter != task_queue_.end(); ++iter) {
  53. if (*iter == pTask) {
  54. task_queue_.erase(iter);
  55. return true;
  56. }
  57. }
  58. return false;
  59. }
  60. void RemoveAll() {
  61. std::lock_guard<std::mutex> locker(mutex_);
  62. task_queue_.clear();
  63. }
  64. public:
  65. size_t max_size;
  66. protected:
  67. std::list<std::shared_ptr<HTask>> task_queue_;
  68. std::mutex mutex_;
  69. };
  70. #endif // TASK_QUEUE_H_