Blame view

3rdparty/boost_1_81_0/boost/fiber/properties.hpp 2.41 KB
63e88f80   Hu Chunming   提交三方库
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
  //          Copyright Nat Goodspeed 2014.
  // 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)
  
  // Define fiber_properties, a base class from which a library consumer can
  // derive a subclass with specific properties important to a user-coded
  // scheduler.
  
  #ifndef BOOST_FIBERS_PROPERTIES_HPP
  #define BOOST_FIBERS_PROPERTIES_HPP
  
  #include <boost/assert.hpp>
  #include <boost/fiber/detail/config.hpp>
  
  #ifdef BOOST_HAS_ABI_HEADERS
  #  include BOOST_ABI_PREFIX
  #endif
  
  # if defined(BOOST_MSVC)
  # pragma warning(push)
  # pragma warning(disable:4275)
  # endif
  
  namespace boost {
  namespace fibers {
  
  class context;
  
  namespace algo {
  
  class algorithm;
  
  }
  
  class BOOST_FIBERS_DECL fiber_properties {
  protected:
      // initialized by constructor
      context         *   ctx_;
      // set every time this fiber becomes READY
      algo::algorithm *   algo_{ nullptr };
  
      // Inform the relevant algorithm instance that something important
      // has changed, so it can (presumably) adjust its data structures
      // accordingly.
      void notify() noexcept;
  
  public:
      // Any specific property setter method, after updating the relevant
      // instance variable, can/should call notify().
  
      // fiber_properties, and by implication every subclass, must accept a back
      // pointer to its context.
  
      // For fiber_properties passed to fiber constructors, nullptr must be
      // used here.
      explicit fiber_properties( context * ctx) noexcept :
          ctx_{ ctx } {
      }
  
      // We need a virtual destructor (hence a vtable) because fiber_properties
      // is stored polymorphically (as fiber_properties*) in context, and
      // destroyed via that pointer.
      virtual ~fiber_properties() = default;
  
      // not really intended for public use, but algorithm_with_properties
      // must be able to call this
      void set_algorithm( algo::algorithm * algo) noexcept {
          algo_ = algo;
      }
  
      // not really intended for public use, but required to set properties
      // on fiber/context construction.
      void set_context( context* ctx ) noexcept {
          BOOST_ASSERT( ctx_ == nullptr );
          BOOST_ASSERT( ctx != nullptr );
          ctx_ = ctx;
      }
  };
  
  }} // namespace boost::fibers
  
  # if defined(BOOST_MSVC)
  # pragma warning(pop)
  # endif
  
  #ifdef BOOST_HAS_ABI_HEADERS
  #  include BOOST_ABI_SUFFIX
  #endif
  
  #endif // BOOST_FIBERS_PROPERTIES_HPP