Browse Source

减少event的一个自旋锁

tags/v2.9.7
tearshark 4 years ago
parent
commit
042e85f077
2 changed files with 15 additions and 19 deletions
  1. 10
    16
      librf/src/event_v2.cpp
  2. 5
    3
      librf/src/event_v2.inl

+ 10
- 16
librf/src/event_v2.cpp View File

@@ -22,24 +22,20 @@ RESUMEF_NS

void state_event_t::on_cancel() noexcept
{
scoped_lock<lock_type> lock_(_mtx);

if (_value != nullptr)
bool* oldValue = _value.load(std::memory_order_acquire);
if (oldValue != nullptr && _value.compare_exchange_weak(oldValue, nullptr, std::memory_order_acq_rel))
{
*_value = false;
_value = nullptr;
*oldValue = false;
this->_coro = nullptr;
}
this->_coro = nullptr;
}

bool state_event_t::on_notify()
{
scoped_lock<lock_type> lock_(_mtx);

if (_value != nullptr)
bool* oldValue = _value.load(std::memory_order_acquire);
if (oldValue != nullptr && _value.compare_exchange_weak(oldValue, nullptr, std::memory_order_acq_rel))
{
*_value = true;
_value = nullptr;
*oldValue = true;

assert(this->_scheduler != nullptr);
if (this->_coro)
@@ -52,12 +48,10 @@ RESUMEF_NS

bool state_event_t::on_timeout()
{
scoped_lock<lock_type> lock_(_mtx);

if (_value != nullptr)
bool* oldValue = _value.load(std::memory_order_acquire);
if (oldValue != nullptr && _value.compare_exchange_weak(oldValue, nullptr, std::memory_order_acq_rel))
{
*_value = false;
_value = nullptr;
*oldValue = false;

assert(this->_scheduler != nullptr);
if (this->_coro)

+ 5
- 3
librf/src/event_v2.inl View File

@@ -92,9 +92,11 @@ RESUMEF_NS
//为浸入式单向链表提供的next指针
counted_ptr<state_event_t> _next = nullptr;
private:
//std::atomic<bool*> _value;
bool* _value;
mutable lock_type _mtx;
//_value引用awaitor保存的值,这样可以尽可能减少创建state的可能。而不必进入没有state就没有value实体被用于返回。
//在调用on_notify()或on_timeout()任意之一后,置为nullptr。
//这样来保证要么超时了,要么响应了signal的通知了。
//这个指针在on_notify()和on_timeout()里,当作一个互斥的锁来防止同时进入两个函数
std::atomic<bool*> _value;
};
}

Loading…
Cancel
Save