1 // Copyright Nat Goodspeed 2014. 2 // Distributed under the Boost Software License, Version 1.0. 3 // (See accompanying file LICENSE_1_0.txt or copy at 4 // http://www.boost.org/LICENSE_1_0.txt) 5 6 // Define fiber_properties, a base class from which a library consumer can 7 // derive a subclass with specific properties important to a user-coded 8 // scheduler. 9 10 #ifndef BOOST_FIBERS_PROPERTIES_HPP 11 #define BOOST_FIBERS_PROPERTIES_HPP 12 13 #include <boost/fiber/detail/config.hpp> 14 15 #ifdef BOOST_HAS_ABI_HEADERS 16 # include BOOST_ABI_PREFIX 17 #endif 18 19 # if defined(BOOST_MSVC) 20 # pragma warning(push) 21 # pragma warning(disable:4275) 22 # endif 23 24 namespace boost { 25 namespace fibers { 26 27 class context; 28 29 namespace algo { 30 31 class algorithm; 32 33 } 34 35 class BOOST_FIBERS_DECL fiber_properties { 36 protected: 37 // initialized by constructor 38 context * ctx_; 39 // set every time this fiber becomes READY 40 algo::algorithm * algo_{ nullptr }; 41 42 // Inform the relevant algorithm instance that something important 43 // has changed, so it can (presumably) adjust its data structures 44 // accordingly. 45 void notify() noexcept; 46 47 public: 48 // Any specific property setter method, after updating the relevant 49 // instance variable, can/should call notify(). 50 51 // fiber_properties, and by implication every subclass, must accept a back 52 // pointer to its context. fiber_properties(context * ctx)53 explicit fiber_properties( context * ctx) noexcept : 54 ctx_{ ctx } { 55 } 56 57 // We need a virtual destructor (hence a vtable) because fiber_properties 58 // is stored polymorphically (as fiber_properties*) in context, and 59 // destroyed via that pointer. 60 virtual ~fiber_properties() = default; 61 62 // not really intended for public use, but algorithm_with_properties 63 // must be able to call this set_algorithm(algo::algorithm * algo)64 void set_algorithm( algo::algorithm * algo) noexcept { 65 algo_ = algo; 66 } 67 }; 68 69 }} // namespace boost::fibers 70 71 # if defined(BOOST_MSVC) 72 # pragma warning(pop) 73 # endif 74 75 #ifdef BOOST_HAS_ABI_HEADERS 76 # include BOOST_ABI_SUFFIX 77 #endif 78 79 #endif // BOOST_FIBERS_PROPERTIES_HPP 80