/usr/include/boost/fiber/scheduler.hpp is in libboost1.62-dev 1.62.0+dfsg-4.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 | // Copyright Oliver Kowalke 2013.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
#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/execution_context.hpp>
#include <boost/intrusive/list.hpp>
#include <boost/intrusive_ptr.hpp>
#include <boost/intrusive/set.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_t;
private:
typedef std::vector< context * > remote_ready_queue_t;
typedef intrusive::set<
context,
intrusive::member_hook<
context, detail::sleep_hook, & context::sleep_hook_ >,
intrusive::constant_time_size< false >,
intrusive::compare< timepoint_less > > sleep_queue_t;
typedef intrusive::list<
context,
intrusive::member_hook<
context, detail::terminated_hook, & context::terminated_hook_ >,
intrusive::constant_time_size< false > > terminated_queue_t;
typedef intrusive::list<
context,
intrusive::member_hook<
context, detail::worker_hook, & context::worker_hook_ >,
intrusive::constant_time_size< false > > worker_queue_t;
std::unique_ptr< algo::algorithm > algo_;
context * main_ctx_{ nullptr };
intrusive_ptr< context > dispatcher_ctx_{};
// worker-queue contains all context' mananged by this scheduler
// except main-context and dispatcher-context
// unlink happens on destruction of a context
worker_queue_t worker_queue_{};
// terminated-queue contains context' which have been terminated
terminated_queue_t terminated_queue_{};
// remote ready-queue contains context' signaled by schedulers
// running in other threads
remote_ready_queue_t remote_ready_queue_{};
// sleep-queue cotnains context' whic hahve been called
// scheduler::wait_until()
sleep_queue_t sleep_queue_{};
bool shutdown_{ false };
std::mutex remote_ready_mtx_{};
context * get_next_() noexcept;
void release_terminated_() noexcept;
void remote_ready2ready_() noexcept;
void sleep2ready_() noexcept;
public:
scheduler() noexcept;
scheduler( scheduler const&) = delete;
scheduler & operator=( scheduler const&) = delete;
virtual ~scheduler();
void set_ready( context *) noexcept;
void set_remote_ready( context *) noexcept;
#if (BOOST_EXECUTION_CONTEXT==1)
void dispatch() noexcept;
void set_terminated( context *) noexcept;
#else
boost::context::execution_context< detail::data_t * > dispatch() noexcept;
boost::context::execution_context< detail::data_t * > set_terminated( context *) noexcept;
#endif
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 &) noexcept;
void suspend() noexcept;
void suspend( detail::spinlock_lock &) noexcept;
bool has_ready_fibers() const noexcept;
void set_algo( std::unique_ptr< algo::algorithm >) 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 // BOOST_FIBERS_FIBER_MANAGER_H
|