Browse Source

在state上使用自旋锁替换递归锁,以减少内存占用

tags/v2.9.7
tearshark 4 years ago
parent
commit
0e5ac70991
5 changed files with 16 additions and 16 deletions
  1. 1
    1
      benchmark/benchmark_async_mem.cpp
  2. 3
    3
      librf/src/state.cpp
  3. 4
    4
      librf/src/state.h
  4. 6
    6
      librf/src/state.inl
  5. 2
    2
      vs_proj/librf.cpp

+ 1
- 1
benchmark/benchmark_async_mem.cpp View File

#include "librf.h" #include "librf.h"
const size_t N = 1000000;
const size_t N = 10000000;
const size_t LOOP_COUNT = 100; const size_t LOOP_COUNT = 100;
volatile size_t globalValue = 0; volatile size_t globalValue = 0;

+ 3
- 3
librf/src/state.cpp View File

bool state_future_t::is_ready() const bool state_future_t::is_ready() const
{ {
scoped_lock<lock_type> __guard(this->_mtx); scoped_lock<lock_type> __guard(this->_mtx);
return _exception != nullptr || _has_value || !_is_awaitor;
return _exception != nullptr || _has_value.load(std::memory_order_acquire) || !_is_awaitor;
} }
void state_future_t::set_exception(std::exception_ptr e) void state_future_t::set_exception(std::exception_ptr e)
if (this->_exception) if (this->_exception)
std::rethrow_exception(std::move(this->_exception)); std::rethrow_exception(std::move(this->_exception));
if (!this->_has_value)
if (!this->_has_value.load(std::memory_order_acquire))
std::rethrow_exception(std::make_exception_ptr(future_exception{error_code::not_ready})); std::rethrow_exception(std::make_exception_ptr(future_exception{error_code::not_ready}));
} }
{ {
{ {
scoped_lock<lock_type> __guard(this->_mtx); scoped_lock<lock_type> __guard(this->_mtx);
this->_has_value = true;
this->_has_value.store(true, std::memory_order_release);
} }
scheduler_t* sch = this->get_scheduler(); scheduler_t* sch = this->get_scheduler();

+ 4
- 4
librf/src/state.h View File

#endif #endif
std::exception_ptr _exception; std::exception_ptr _exception;
uint32_t _alloc_size; uint32_t _alloc_size;
bool _has_value = false;
std::atomic<bool> _has_value{ false };
bool _is_awaitor; bool _is_awaitor;
initor_type _is_initor = initor_type::None; initor_type _is_initor = initor_type::None;
public: public:
void future_await_suspend(coroutine_handle<_PromiseT> handler); void future_await_suspend(coroutine_handle<_PromiseT> handler);
bool future_await_ready() bool future_await_ready()
{ {
scoped_lock<lock_type> __guard(this->_mtx);
return _has_value;
//scoped_lock<lock_type> __guard(this->_mtx);
return _has_value.load(std::memory_order_acquire);
} }
template<class _PromiseT, typename = std::enable_if_t<is_promise_v<_PromiseT>>> template<class _PromiseT, typename = std::enable_if_t<is_promise_v<_PromiseT>>>
public: public:
~state_t() ~state_t()
{ {
if (_has_value)
if (_has_value.load(std::memory_order_acquire))
cast_value_ptr()->~value_type(); cast_value_ptr()->~value_type();
} }

+ 6
- 6
librf/src/state.inl View File

this->_coro = handler; this->_coro = handler;
} }


this->_has_value = true;
this->_has_value.store(true, std::memory_order_release);
} }


if (!handler.done()) if (!handler.done())
this->_coro = handler; this->_coro = handler;
} }


if (this->_has_value)
if (this->_has_value.load(std::memory_order_acquire))
{ {
*this->cast_value_ptr() = std::forward<U>(val); *this->cast_value_ptr() = std::forward<U>(val);
} }
else else
{ {
new (this->cast_value_ptr()) value_type(std::forward<U>(val)); new (this->cast_value_ptr()) value_type(std::forward<U>(val));
this->_has_value = true;
this->_has_value.store(true, std::memory_order_release);
} }
} }


scoped_lock<lock_type> __guard(this->_mtx); scoped_lock<lock_type> __guard(this->_mtx);
if (this->_exception) if (this->_exception)
std::rethrow_exception(std::move(this->_exception)); std::rethrow_exception(std::move(this->_exception));
if (!this->_has_value)
if (!this->_has_value.load(std::memory_order_acquire))
std::rethrow_exception(std::make_exception_ptr(future_exception{error_code::not_ready})); std::rethrow_exception(std::make_exception_ptr(future_exception{error_code::not_ready}));


return std::move(*this->cast_value_ptr()); return std::move(*this->cast_value_ptr());
{ {
scoped_lock<lock_type> __guard(this->_mtx); scoped_lock<lock_type> __guard(this->_mtx);


if (this->_has_value)
if (this->_has_value.load(std::memory_order_acquire))
{ {
*this->cast_value_ptr() = std::forward<U>(val); *this->cast_value_ptr() = std::forward<U>(val);
} }
else else
{ {
new (this->cast_value_ptr()) value_type(std::forward<U>(val)); new (this->cast_value_ptr()) value_type(std::forward<U>(val));
this->_has_value = true;
this->_has_value.store(true, std::memory_order_release);
} }
} }



+ 2
- 2
vs_proj/librf.cpp View File

{ {
(void)argc; (void)argc;
(void)argv; (void)argv;
//resumable_main_layout();
//return 0;
resumable_main_layout();
return 0;
//if (argc > 1) //if (argc > 1)
// resumable_main_benchmark_asio_client(atoi(argv[1])); // resumable_main_benchmark_asio_client(atoi(argv[1]));

Loading…
Cancel
Save