123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165 |
- #ifndef BOOST_FIBERS_FIBER_MANAGER_H
- #define BOOST_FIBERS_FIBER_MANAGER_H
- #include <chrono>
- #include <functional>
- #include <memory>
- #include <mutex>
- #include <vector>
- #include <boost/config.hpp>
- #include <boost/context/fiber.hpp>
- #include <boost/intrusive/list.hpp>
- #include <boost/intrusive_ptr.hpp>
- #include <boost/intrusive/set.hpp>
- #include <boost/intrusive/slist.hpp>
- #include <boost/fiber/algo/algorithm.hpp>
- #include <boost/fiber/context.hpp>
- #include <boost/fiber/detail/config.hpp>
- #include <boost/fiber/detail/data.hpp>
- #include <boost/fiber/detail/spinlock.hpp>
- #ifdef BOOST_HAS_ABI_HEADERS
- # include BOOST_ABI_PREFIX
- #endif
- #ifdef _MSC_VER
- # pragma warning(push)
- # pragma warning(disable:4251)
- #endif
- namespace boost {
- namespace fibers {
- class BOOST_FIBERS_DECL scheduler {
- public:
- struct timepoint_less {
- bool operator()( context const& l, context const& r) const noexcept {
- return l.tp_ < r.tp_;
- }
- };
- typedef intrusive::list<
- context,
- intrusive::member_hook<
- context, detail::ready_hook, & context::ready_hook_ >,
- intrusive::constant_time_size< false >
- > ready_queue_type;
- private:
- typedef intrusive::multiset<
- context,
- intrusive::member_hook<
- context, detail::sleep_hook, & context::sleep_hook_ >,
- intrusive::constant_time_size< false >,
- intrusive::compare< timepoint_less >
- > sleep_queue_type;
- typedef intrusive::list<
- context,
- intrusive::member_hook<
- context, detail::worker_hook, & context::worker_hook_ >,
- intrusive::constant_time_size< false >
- > worker_queue_type;
- typedef intrusive::slist<
- context,
- intrusive::member_hook<
- context, detail::terminated_hook, & context::terminated_hook_ >,
- intrusive::linear< true >,
- intrusive::cache_last< true >
- > terminated_queue_type;
- typedef intrusive::slist<
- context,
- intrusive::member_hook<
- context, detail::remote_ready_hook, & context::remote_ready_hook_ >,
- intrusive::linear< true >,
- intrusive::cache_last< true >
- > remote_ready_queue_type;
- #if ! defined(BOOST_FIBERS_NO_ATOMICS)
-
-
- detail::spinlock remote_ready_splk_{};
- remote_ready_queue_type remote_ready_queue_{};
- #endif
- algo::algorithm::ptr_t algo_;
-
-
- sleep_queue_type sleep_queue_{};
-
-
-
- worker_queue_type worker_queue_{};
-
- terminated_queue_type terminated_queue_{};
- intrusive_ptr< context > dispatcher_ctx_{};
- context * main_ctx_{ nullptr };
- bool shutdown_{ false };
- void release_terminated_() noexcept;
- #if ! defined(BOOST_FIBERS_NO_ATOMICS)
- void remote_ready2ready_() noexcept;
- #endif
- void sleep2ready_() noexcept;
- public:
- scheduler(algo::algorithm::ptr_t algo) noexcept;
- scheduler( scheduler const&) = delete;
- scheduler & operator=( scheduler const&) = delete;
- virtual ~scheduler();
- void schedule( context *) noexcept;
- #if ! defined(BOOST_FIBERS_NO_ATOMICS)
- void schedule_from_remote( context *) noexcept;
- #endif
- boost::context::fiber dispatch() noexcept;
- boost::context::fiber terminate( detail::spinlock_lock &, context *) noexcept;
- void yield( context *) noexcept;
- bool wait_until( context *,
- std::chrono::steady_clock::time_point const&) noexcept;
- bool wait_until( context *,
- std::chrono::steady_clock::time_point const&,
- detail::spinlock_lock &,
- waker &&) noexcept;
- void suspend() noexcept;
- void suspend( detail::spinlock_lock &) noexcept;
- bool has_ready_fibers() const noexcept;
- void set_algo( algo::algorithm::ptr_t) noexcept;
- void attach_main_context( context *) noexcept;
- void attach_dispatcher_context( intrusive_ptr< context >) noexcept;
- void attach_worker_context( context *) noexcept;
- void detach_worker_context( context *) noexcept;
- };
- }}
- #ifdef _MSC_VER
- # pragma warning(pop)
- #endif
- #ifdef BOOST_HAS_ABI_HEADERS
- # include BOOST_ABI_SUFFIX
- #endif
- #endif
|