123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 |
- #ifndef _zloop_hpp_
- #define _zloop_hpp_
- #include <vector>
- #include <list>
- #include <atomic>
- #include <mutex>
- #include <assert.h>
- #include <ev++.h>
- struct zloop_base:ev::dynamic_loop
- //struct zloop_base:ev::loop_ref
- {
- std::atomic<bool> m_stop_flag{false};
- ev::async m_async;
- int check_stop_flag()
- {
- if(!m_stop_flag.load())
- return 0;
- break_loop(ev::ALL);
- return 1;
- }
- virtual void on_async_0(){}
- void async_stop()
- {
- m_stop_flag.store(true);
- m_async.send();
- }
- zloop_base()
- :m_async(*this)
- {
- m_async.set<zloop_base,&zloop_base::on_async_0>(this);
- m_async.start();
- }
- virtual ~zloop_base()
- {
- m_async.stop();
- }
- };
- template<typename NT>
- struct zloop:zloop_base
- {
- std::mutex m_mutex;
- std::list<NT> m_async_list;
- virtual void on_async_0()
- {
- if(check_stop_flag())
- return;
- std::list<NT> async_list;
- {
- std::unique_lock<std::mutex> _lock(m_mutex);
- m_async_list.swap(async_list);
- }
- on_async(async_list);
-
- }
- virtual void on_async(const std::list<NT>&nt){}
- void async_request(NT tk)
- {
- {
- std::unique_lock<std::mutex> _lock(m_mutex);
- m_async_list.push_back(tk);
- }
- m_async.send();
- }
- zloop()
- {
- }
- ~zloop()
- {
- }
- };
- #endif
|