25'ten fazla konu seçemezsiniz Konular bir harf veya rakamla başlamalı, kısa çizgiler ('-') içerebilir ve en fazla 35 karakter uzunluğunda olabilir.

68 satır
1.5 KiB

  1. #pragma once
  2. #include <sstream> // TODO debug!
  3. #include <queue>
  4. #include <ecs/config.h>
  5. #include <moodycamel/concurrentqueue.h>
  6. #include "../fixed_function.h"
  7. namespace ecs {
  8. namespace core {
  9. namespace utils {
  10. /**
  11. * Functor to execute as task inside the thread pool. The functor can have a max size of 128 bytes!
  12. */
  13. using task = fixed_function<void(size_t thread_id), 128>;
  14. /**
  15. * normal task queue
  16. */
  17. using task_queue = std::queue<task>;
  18. /**
  19. * none blocking concurrent queue to store thread pool tasks in
  20. */
  21. struct concurrent_task_queue
  22. {
  23. private:
  24. using inner_queue_type = moodycamel::ConcurrentQueue<task>;
  25. private:
  26. std::atomic<ssize_t> _count;
  27. inner_queue_type _inner_queue;
  28. public:
  29. /**
  30. * constructor
  31. */
  32. concurrent_task_queue();
  33. /**
  34. * check if the task queue is empty
  35. *
  36. * @retval TRUE if the queue is empty
  37. * @retval FALSE if the queue contains at least one element
  38. */
  39. inline bool empty() const;
  40. /**
  41. * push a new element to the queue
  42. *
  43. * @param t task to push to queue
  44. */
  45. void push(task&& t);
  46. /**
  47. * try to get dequeue a task from the queue
  48. *
  49. * @param t dequeued task
  50. *
  51. * @retval TRUE if an task was dequeued
  52. * @retval FALSE if the queue is empty
  53. */
  54. bool pop(task& t);
  55. };
  56. } } }