1
0

zloop.h 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. #ifndef _zloop_hpp_
  2. #define _zloop_hpp_
  3. #include <vector>
  4. #include <list>
  5. #include <atomic>
  6. #include <mutex>
  7. #include <assert.h>
  8. #include <ev++.h>
  9. struct zloop_base:ev::dynamic_loop
  10. //struct zloop_base:ev::loop_ref
  11. {
  12. std::atomic<bool> m_stop_flag{false};
  13. ev::async m_async;
  14. int check_stop_flag()
  15. {
  16. if(!m_stop_flag.load())
  17. return 0;
  18. break_loop(ev::ALL);
  19. return 1;
  20. }
  21. virtual void on_async_0(){}
  22. void async_stop()
  23. {
  24. m_stop_flag.store(true);
  25. m_async.send();
  26. }
  27. zloop_base()
  28. :m_async(*this)
  29. {
  30. m_async.set<zloop_base,&zloop_base::on_async_0>(this);
  31. m_async.start();
  32. }
  33. virtual ~zloop_base()
  34. {
  35. m_async.stop();
  36. }
  37. };
  38. template<typename NT>
  39. struct zloop:zloop_base
  40. {
  41. std::mutex m_mutex;
  42. std::list<NT> m_async_list;
  43. virtual void on_async_0()
  44. {
  45. if(check_stop_flag())
  46. return;
  47. std::list<NT> async_list;
  48. {
  49. std::unique_lock<std::mutex> _lock(m_mutex);
  50. m_async_list.swap(async_list);
  51. }
  52. on_async(async_list);
  53. }
  54. virtual void on_async(const std::list<NT>&nt){}
  55. void async_request(NT tk)
  56. {
  57. {
  58. std::unique_lock<std::mutex> _lock(m_mutex);
  59. m_async_list.push_back(tk);
  60. }
  61. m_async.send();
  62. }
  63. zloop()
  64. {
  65. }
  66. ~zloop()
  67. {
  68. }
  69. };
  70. #endif