89 lines
1.9 KiB
C++
89 lines
1.9 KiB
C++
|
#ifndef BOOST_FIBERS_WAKER_H
|
||
|
#define BOOST_FIBERS_WAKER_H
|
||
|
|
||
|
#include <cstddef>
|
||
|
|
||
|
#include <boost/config.hpp>
|
||
|
#include <boost/fiber/detail/config.hpp>
|
||
|
#include <boost/fiber/detail/spinlock.hpp>
|
||
|
#include <boost/intrusive/slist.hpp>
|
||
|
|
||
|
namespace boost {
|
||
|
namespace fibers {
|
||
|
|
||
|
class context;
|
||
|
|
||
|
namespace detail {
|
||
|
|
||
|
typedef intrusive::slist_member_hook<> waker_queue_hook;
|
||
|
|
||
|
} // detail
|
||
|
|
||
|
|
||
|
class BOOST_FIBERS_DECL waker {
|
||
|
private:
|
||
|
context *ctx_{};
|
||
|
size_t epoch_{};
|
||
|
|
||
|
public:
|
||
|
friend class context;
|
||
|
|
||
|
waker() = default;
|
||
|
|
||
|
waker(context * ctx, const size_t epoch)
|
||
|
: ctx_{ ctx }
|
||
|
, epoch_{ epoch }
|
||
|
{}
|
||
|
|
||
|
bool wake() const noexcept;
|
||
|
};
|
||
|
|
||
|
|
||
|
class BOOST_FIBERS_DECL waker_with_hook : public waker {
|
||
|
public:
|
||
|
explicit waker_with_hook(waker && w)
|
||
|
: waker{ std::move(w) }
|
||
|
{}
|
||
|
|
||
|
bool is_linked() const noexcept {
|
||
|
return waker_queue_hook_.is_linked();
|
||
|
}
|
||
|
|
||
|
friend bool
|
||
|
operator==( waker const& lhs, waker const& rhs) noexcept {
|
||
|
return & lhs == & rhs;
|
||
|
}
|
||
|
|
||
|
public:
|
||
|
detail::waker_queue_hook waker_queue_hook_{};
|
||
|
};
|
||
|
|
||
|
namespace detail {
|
||
|
typedef intrusive::slist<
|
||
|
waker_with_hook,
|
||
|
intrusive::member_hook<
|
||
|
waker_with_hook, detail::waker_queue_hook, & waker_with_hook::waker_queue_hook_ >,
|
||
|
intrusive::constant_time_size< false >,
|
||
|
intrusive::cache_last< true >
|
||
|
> waker_slist_t;
|
||
|
}
|
||
|
|
||
|
class BOOST_FIBERS_DECL wait_queue {
|
||
|
private:
|
||
|
detail::waker_slist_t slist_{};
|
||
|
|
||
|
public:
|
||
|
void suspend_and_wait( detail::spinlock_lock &, context *);
|
||
|
bool suspend_and_wait_until( detail::spinlock_lock &,
|
||
|
context *,
|
||
|
std::chrono::steady_clock::time_point const&);
|
||
|
void notify_one();
|
||
|
void notify_all();
|
||
|
|
||
|
bool empty() const;
|
||
|
};
|
||
|
|
||
|
}}
|
||
|
|
||
|
#endif // BOOST_FIBERS_WAKER_H
|