1
0
mirror of https://github.com/tearshark/librf.git synced 2024-10-01 15:57:07 +08:00
librf/source/when_v2.cpp

59 lines
1016 B
C++
Raw Normal View History

2021-11-01 17:59:08 +08:00
#include "librf/librf.h"
2020-03-12 16:56:23 +08:00
2021-11-01 17:59:08 +08:00
namespace librf
2020-03-12 16:56:23 +08:00
{
namespace detail
{
LIBRF_API state_when_t::state_when_t(intptr_t counter_)
2020-03-12 16:56:23 +08:00
:_counter(counter_)
{
}
LIBRF_API void state_when_t::resume()
2020-03-12 16:56:23 +08:00
{
coroutine_handle<> handler = _coro;
if (handler)
{
_coro = nullptr;
_scheduler->del_final(this);
handler.resume();
}
}
LIBRF_API bool state_when_t::has_handler() const noexcept
2020-03-12 16:56:23 +08:00
{
return (bool)_coro;
}
LIBRF_API void state_when_t::on_cancel() noexcept
2020-03-12 16:56:23 +08:00
{
scoped_lock<lock_type> lock_(_lock);
_counter.store(0);
this->_coro = nullptr;
}
LIBRF_API bool state_when_t::on_notify_one()
2020-03-12 16:56:23 +08:00
{
scoped_lock<lock_type> lock_(_lock);
if (_counter.fetch_sub(1, std::memory_order_acq_rel) == 1)
{
assert(this->_scheduler != nullptr);
if (this->_coro)
this->_scheduler->add_generator(this);
return true;
}
return false;
}
LIBRF_API bool state_when_t::on_timeout()
2020-03-12 16:56:23 +08:00
{
scoped_lock<lock_type> lock_(_lock);
return false;
}
}
}