diff --git a/include/bitcoin/node/block_memory.hpp b/include/bitcoin/node/block_memory.hpp index 83d8b7fe..21f77173 100644 --- a/include/bitcoin/node/block_memory.hpp +++ b/include/bitcoin/node/block_memory.hpp @@ -36,9 +36,8 @@ class BCN_API block_memory final public: DELETE_COPY_MOVE_DESTRUCT(block_memory); - /// Store the size for each thread's arena initilization. /// Default allocate each arena to preclude allcation and locking. - block_memory(size_t size, size_t threads) NOEXCEPT; + block_memory(size_t bytes, size_t threads) NOEXCEPT; /// Each thread obtains an arena of the same size. arena* get_arena() NOEXCEPT override; @@ -47,13 +46,13 @@ class BCN_API block_memory final retainer::ptr get_retainer() NOEXCEPT override; protected: - block_arena* get_block_arena() NOEXCEPT; + block_arena* get_block_arena() THROWS; private: - // These are thread safe. + // This is thread safe. std::atomic_size_t count_; - // This is protected by thread_local member. + // This is protected by constructor init and thread_local indexation. std::vector<block_arena> arenas_; }; diff --git a/src/block_memory.cpp b/src/block_memory.cpp index 49641e5a..6fdf29e7 100644 --- a/src/block_memory.cpp +++ b/src/block_memory.cpp @@ -25,17 +25,19 @@ namespace libbitcoin { namespace node { -block_memory::block_memory(size_t size, size_t threads) NOEXCEPT +block_memory::block_memory(size_t bytes, size_t threads) NOEXCEPT : count_{}, arenas_{} { arenas_.reserve(threads); for (auto index = zero; index < threads; ++index) - arenas_.emplace_back(size); + arenas_.emplace_back(bytes); } arena* block_memory::get_arena() NOEXCEPT { + BC_PUSH_WARNING(NO_THROW_IN_NOEXCEPT) return get_block_arena(); + BC_POP_WARNING() } retainer::ptr block_memory::get_retainer() NOEXCEPT @@ -47,12 +49,13 @@ retainer::ptr block_memory::get_retainer() NOEXCEPT // protected -block_arena* block_memory::get_block_arena() NOEXCEPT +block_arena* block_memory::get_block_arena() THROWS { static thread_local auto index = count_.fetch_add(one); + // More threads are requesting an arena than specified at construct. if (index >= arenas_.size()) - return nullptr; + throw allocation_exception(); return &arenas_.at(index); }