ソースを参照

减少event的一个自旋锁

tags/v2.9.7
tearshark 4年前
コミット
042e85f077
2個のファイルの変更15行の追加19行の削除
  1. 10
    16
      librf/src/event_v2.cpp
  2. 5
    3
      librf/src/event_v2.inl

+ 10
- 16
librf/src/event_v2.cpp ファイルの表示



void state_event_t::on_cancel() noexcept 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() 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); assert(this->_scheduler != nullptr);
if (this->_coro) if (this->_coro)


bool state_event_t::on_timeout() 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); assert(this->_scheduler != nullptr);
if (this->_coro) if (this->_coro)

+ 5
- 3
librf/src/event_v2.inl ファイルの表示

//为浸入式单向链表提供的next指针 //为浸入式单向链表提供的next指针
counted_ptr<state_event_t> _next = nullptr; counted_ptr<state_event_t> _next = nullptr;
private: 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;
}; };
} }

読み込み中…
キャンセル
保存