libfoedus-core
FOEDUS Core Library
|
Pimpl object of PagePool. More...
Pimpl object of PagePool.
A private pimpl object for PagePool. Do not include this header from a client program unless you know what you are doing.
Definition at line 74 of file page_pool_pimpl.hpp.
#include <page_pool_pimpl.hpp>
Public Member Functions | |
PagePoolPimpl () | |
void | attach (PagePoolControlBlock *control_block, void *memory, uint64_t memory_size, bool owns, bool rigorous_page_boundary_check) |
ErrorStack | initialize_once () override |
ErrorStack | uninitialize_once () override |
ErrorCode | grab (uint32_t desired_grab_count, PagePoolOffsetChunk *chunk) |
template<typename CHUNK > | |
void | release_impl (uint32_t desired_release_count, CHUNK *chunk) |
void | release (uint32_t desired_release_count, PagePoolOffsetChunk *chunk) |
void | release (uint32_t desired_release_count, PagePoolOffsetDynamicChunk *chunk) |
void | release (uint32_t desired_release_count, PagePoolOffsetAndEpochChunk *chunk) |
ErrorCode | grab_one (PagePoolOffset *offset) |
void | release_one (PagePoolOffset offset) |
const LocalPageResolver & | get_resolver () const |
PagePool::Stat | get_stat () const |
uint64_t & | free_pool_head () |
uint64_t | free_pool_head () const |
uint64_t | get_free_pool_capacity () const |
uint64_t | get_free_pool_count () const |
void | increase_free_pool_count (uint64_t op) |
void | decrease_free_pool_count (uint64_t op) |
void | assert_free_pool () const |
Not thread safe. More... | |
std::string | get_debug_pool_name () const |
void | set_debug_pool_name (const std::string &name) |
![]() | |
DefaultInitializable () | |
virtual | ~DefaultInitializable () |
DefaultInitializable (const DefaultInitializable &)=delete | |
DefaultInitializable & | operator= (const DefaultInitializable &)=delete |
ErrorStack | initialize () override final |
Typical implementation of Initializable::initialize() that provides initialize-once semantics. More... | |
ErrorStack | uninitialize () override final |
Typical implementation of Initializable::uninitialize() that provides uninitialize-once semantics. More... | |
bool | is_initialized () const override final |
Returns whether the object has been already initialized or not. More... | |
![]() | |
virtual | ~Initializable () |
Public Attributes | |
PagePoolControlBlock * | control_block_ |
void * | memory_ |
The whole memory region of the pool. More... | |
uint64_t | memory_size_ |
Byte size of this page pool. More... | |
bool | owns_ |
Whether this engine owns this page pool. More... | |
bool | rigorous_page_boundary_check_ |
Whether to use mprotect() for page boundaries to detect bogus memory accesses. More... | |
LocalPageResolver | resolver_ |
An object to resolve an offset in this page pool (thus local) to an actual pointer and vice versa. More... | |
storage::Page * | pool_base_ |
Just an auxiliary variable to the beginning of the pool. More... | |
uint64_t | pool_size_ |
Just an auxiliary variable of the size of pool. More... | |
uint64_t | pages_for_free_pool_ |
This many first pages are used for free page maintainance. More... | |
PagePoolOffset * | free_pool_ |
We maintain free pages as a simple circular queue. More... | |
uint64_t | free_pool_capacity_ |
Size of free_pool_. More... | |
Friends | |
std::ostream & | operator<< (std::ostream &o, const PagePoolPimpl &v) |
foedus::memory::PagePoolPimpl::PagePoolPimpl | ( | ) |
Definition at line 40 of file page_pool_pimpl.cpp.
|
inline |
Not thread safe.
Use it after taking a lock.
Definition at line 108 of file page_pool_pimpl.hpp.
References ASSERT_ND, free_pool_, free_pool_capacity_, free_pool_head(), get_free_pool_count(), pages_for_free_pool_, and pool_size_.
Referenced by grab(), initialize_once(), release_impl(), and uninitialize_once().
void foedus::memory::PagePoolPimpl::attach | ( | PagePoolControlBlock * | control_block, |
void * | memory, | ||
uint64_t | memory_size, | ||
bool | owns, | ||
bool | rigorous_page_boundary_check | ||
) |
Definition at line 47 of file page_pool_pimpl.cpp.
References foedus::assorted::FixedString< MAXLEN, CHAR >::clear(), control_block_, foedus::memory::PagePoolControlBlock::debug_pool_name_, free_pool_, free_pool_capacity_, foedus::assorted::int_div_ceil(), foedus::storage::kPageSize, memory_, memory_size_, owns_, pages_for_free_pool_, pool_base_, pool_size_, resolver_, and rigorous_page_boundary_check_.
Referenced by foedus::memory::PagePool::attach().
|
inline |
Definition at line 103 of file page_pool_pimpl.hpp.
References ASSERT_ND, control_block_, and foedus::memory::PagePoolControlBlock::free_pool_count_.
Referenced by grab(), and grab_one().
|
inline |
Definition at line 98 of file page_pool_pimpl.hpp.
References control_block_, and foedus::memory::PagePoolControlBlock::free_pool_head_.
Referenced by assert_free_pool(), grab(), grab_one(), foedus::memory::operator<<(), release_impl(), and release_one().
|
inline |
Definition at line 99 of file page_pool_pimpl.hpp.
References control_block_, and foedus::memory::PagePoolControlBlock::free_pool_head_.
|
inline |
Definition at line 124 of file page_pool_pimpl.hpp.
References control_block_, foedus::memory::PagePoolControlBlock::debug_pool_name_, foedus::assorted::FixedString< MAXLEN, CHAR >::empty(), and foedus::assorted::FixedString< MAXLEN, CHAR >::str().
Referenced by foedus::memory::PagePool::get_debug_pool_name(), grab(), grab_one(), initialize_once(), foedus::memory::operator<<(), release_impl(), release_one(), and uninitialize_once().
|
inline |
Definition at line 100 of file page_pool_pimpl.hpp.
References free_pool_capacity_.
Referenced by foedus::memory::PagePool::get_free_pool_capacity().
|
inline |
Definition at line 101 of file page_pool_pimpl.hpp.
References control_block_, and foedus::memory::PagePoolControlBlock::free_pool_count_.
Referenced by assert_free_pool(), get_stat(), grab(), grab_one(), foedus::memory::operator<<(), release_impl(), release_one(), and uninitialize_once().
|
inline |
Definition at line 96 of file page_pool_pimpl.hpp.
References resolver_.
Referenced by foedus::memory::PagePool::get_resolver().
PagePool::Stat foedus::memory::PagePoolPimpl::get_stat | ( | ) | const |
Definition at line 359 of file page_pool_pimpl.cpp.
References foedus::memory::PagePool::Stat::allocated_pages_, get_free_pool_count(), pages_for_free_pool_, pool_size_, and foedus::memory::PagePool::Stat::total_pages_.
Referenced by foedus::memory::PagePool::get_stat().
ErrorCode foedus::memory::PagePoolPimpl::grab | ( | uint32_t | desired_grab_count, |
PagePoolOffsetChunk * | chunk | ||
) |
Definition at line 191 of file page_pool_pimpl.cpp.
References assert_free_pool(), ASSERT_ND, foedus::memory::PagePoolOffsetChunk::capacity(), control_block_, decrease_free_pool_count(), free_pool_, free_pool_capacity_, free_pool_head(), get_debug_pool_name(), get_free_pool_count(), foedus::kErrorCodeMemoryNoFreePages, foedus::kErrorCodeOk, foedus::memory::PagePoolControlBlock::lock_, foedus::memory::PagePoolOffsetChunk::push_back(), foedus::memory::PagePoolOffsetChunk::size(), and UNLIKELY.
Referenced by foedus::memory::PagePool::grab().
ErrorCode foedus::memory::PagePoolPimpl::grab_one | ( | PagePoolOffset * | offset | ) |
Definition at line 230 of file page_pool_pimpl.cpp.
References ASSERT_ND, control_block_, decrease_free_pool_count(), free_pool_, free_pool_capacity_, free_pool_head(), get_debug_pool_name(), get_free_pool_count(), foedus::kErrorCodeMemoryNoFreePages, foedus::kErrorCodeOk, foedus::memory::PagePoolControlBlock::lock_, and UNLIKELY.
Referenced by foedus::memory::PagePool::grab_one().
|
inline |
Definition at line 102 of file page_pool_pimpl.hpp.
References control_block_, and foedus::memory::PagePoolControlBlock::free_pool_count_.
Referenced by release_impl(), and release_one().
|
overridevirtual |
Implements foedus::DefaultInitializable.
Definition at line 75 of file page_pool_pimpl.cpp.
References foedus::assorted::ProtectedBoundary::acquire_protect(), assert_free_pool(), ASSERT_ND, control_block_, foedus::debugging::StopWatch::elapsed_ms(), free_pool_, free_pool_capacity_, foedus::memory::PagePoolControlBlock::free_pool_count_, foedus::memory::PagePoolControlBlock::free_pool_head_, get_debug_pool_name(), foedus::memory::PagePoolControlBlock::initialize(), foedus::kErrorCodeOk, foedus::kRetOk, foedus::assorted::os_error(), owns_, pages_for_free_pool_, pool_base_, pool_size_, foedus::assorted::ProtectedBoundary::reset(), rigorous_page_boundary_check_, and foedus::debugging::StopWatch::stop().
void foedus::memory::PagePoolPimpl::release | ( | uint32_t | desired_release_count, |
PagePoolOffsetChunk * | chunk | ||
) |
Definition at line 302 of file page_pool_pimpl.cpp.
Referenced by foedus::memory::PagePool::release().
void foedus::memory::PagePoolPimpl::release | ( | uint32_t | desired_release_count, |
PagePoolOffsetDynamicChunk * | chunk | ||
) |
Definition at line 305 of file page_pool_pimpl.cpp.
void foedus::memory::PagePoolPimpl::release | ( | uint32_t | desired_release_count, |
PagePoolOffsetAndEpochChunk * | chunk | ||
) |
Definition at line 308 of file page_pool_pimpl.cpp.
void foedus::memory::PagePoolPimpl::release_impl | ( | uint32_t | desired_release_count, |
CHUNK * | chunk | ||
) |
Definition at line 259 of file page_pool_pimpl.cpp.
References assert_free_pool(), ASSERT_ND, control_block_, free_pool_, free_pool_capacity_, free_pool_head(), get_debug_pool_name(), get_free_pool_count(), increase_free_pool_count(), and foedus::memory::PagePoolControlBlock::lock_.
void foedus::memory::PagePoolPimpl::release_one | ( | PagePoolOffset | offset | ) |
Definition at line 312 of file page_pool_pimpl.cpp.
References ASSERT_ND, COERCE_ERROR, control_block_, ERROR_STACK, free_pool_, free_pool_capacity_, free_pool_head(), get_debug_pool_name(), get_free_pool_count(), increase_free_pool_count(), foedus::DefaultInitializable::is_initialized(), foedus::kErrorCodeMemoryDuplicatePage, foedus::memory::PagePoolControlBlock::lock_, and owns_.
Referenced by foedus::memory::PagePool::release_one().
|
inline |
Definition at line 135 of file page_pool_pimpl.hpp.
References foedus::assorted::FixedString< MAXLEN, CHAR >::assign(), control_block_, and foedus::memory::PagePoolControlBlock::debug_pool_name_.
Referenced by foedus::memory::PagePool::set_debug_pool_name().
|
overridevirtual |
Implements foedus::DefaultInitializable.
Definition at line 152 of file page_pool_pimpl.cpp.
References foedus::assorted::ProtectedBoundary::assert_boundary(), assert_free_pool(), ASSERT_ND, control_block_, foedus::debugging::StopWatch::elapsed_ms(), free_pool_capacity_, foedus::assorted::ProtectedBoundary::get_boundary_name(), get_debug_pool_name(), get_free_pool_count(), foedus::kErrorCodeOk, foedus::kRetOk, foedus::assorted::os_error(), owns_, pages_for_free_pool_, pool_base_, foedus::assorted::ProtectedBoundary::release_protect(), rigorous_page_boundary_check_, foedus::debugging::StopWatch::stop(), and foedus::memory::PagePoolControlBlock::uninitialize().
|
friend |
Definition at line 343 of file page_pool_pimpl.cpp.
PagePoolControlBlock* foedus::memory::PagePoolPimpl::control_block_ |
Definition at line 143 of file page_pool_pimpl.hpp.
Referenced by attach(), decrease_free_pool_count(), free_pool_head(), get_debug_pool_name(), get_free_pool_count(), grab(), grab_one(), increase_free_pool_count(), initialize_once(), release_impl(), release_one(), set_debug_pool_name(), and uninitialize_once().
PagePoolOffset* foedus::memory::PagePoolPimpl::free_pool_ |
We maintain free pages as a simple circular queue.
We append new/released pages to tail while we eat from head.
Definition at line 181 of file page_pool_pimpl.hpp.
Referenced by assert_free_pool(), attach(), grab(), grab_one(), initialize_once(), release_impl(), and release_one().
uint64_t foedus::memory::PagePoolPimpl::free_pool_capacity_ |
Size of free_pool_.
Immutable once initialized.
Definition at line 183 of file page_pool_pimpl.hpp.
Referenced by assert_free_pool(), attach(), get_free_pool_capacity(), foedus::memory::PagePool::get_recommended_pages_per_grab(), grab(), grab_one(), initialize_once(), foedus::memory::operator<<(), release_impl(), release_one(), and uninitialize_once().
void* foedus::memory::PagePoolPimpl::memory_ |
The whole memory region of the pool.
Definition at line 146 of file page_pool_pimpl.hpp.
Referenced by attach(), and foedus::memory::operator<<().
uint64_t foedus::memory::PagePoolPimpl::memory_size_ |
Byte size of this page pool.
Definition at line 149 of file page_pool_pimpl.hpp.
Referenced by attach(), foedus::memory::PagePool::get_memory_size(), and foedus::memory::operator<<().
bool foedus::memory::PagePoolPimpl::owns_ |
Whether this engine owns this page pool.
If not, initialize just attaches
Definition at line 152 of file page_pool_pimpl.hpp.
Referenced by attach(), initialize_once(), foedus::memory::operator<<(), release_one(), and uninitialize_once().
uint64_t foedus::memory::PagePoolPimpl::pages_for_free_pool_ |
This many first pages are used for free page maintainance.
This also means that "Page-0" never appears in our engine, thus we can use offset=0 as null. In other words, all offsets grabbed/released should be equal or larger than this value. Immutable once initialized.
Definition at line 175 of file page_pool_pimpl.hpp.
Referenced by assert_free_pool(), attach(), get_stat(), initialize_once(), foedus::memory::operator<<(), and uninitialize_once().
storage::Page* foedus::memory::PagePoolPimpl::pool_base_ |
Just an auxiliary variable to the beginning of the pool.
Same as memory_.get_block().
Definition at line 164 of file page_pool_pimpl.hpp.
Referenced by attach(), foedus::memory::PagePool::get_base(), initialize_once(), and uninitialize_once().
uint64_t foedus::memory::PagePoolPimpl::pool_size_ |
Just an auxiliary variable of the size of pool.
Same as memory_byte_size/kPageSize.
Definition at line 167 of file page_pool_pimpl.hpp.
Referenced by assert_free_pool(), attach(), get_stat(), and initialize_once().
LocalPageResolver foedus::memory::PagePoolPimpl::resolver_ |
An object to resolve an offset in this page pool (thus local) to an actual pointer and vice versa.
Definition at line 161 of file page_pool_pimpl.hpp.
Referenced by attach(), and get_resolver().
bool foedus::memory::PagePoolPimpl::rigorous_page_boundary_check_ |
Whether to use mprotect() for page boundaries to detect bogus memory accesses.
Similar to rigorous_memory_boundary_check_, but this one is about page pools. When true, we waste a half of volatile/snapshot page pool, putting mprotect in odd-numbered page indexes. The threads receive only the even-numbered indexes, so if any read/write overruns a page, a signal is fired. This makes the execution quite slower and wastes half of memory, so use it just for debugging. This flag also disables hugepages used for snapshot page pool for mprotect to work, so makes it really SLOW. Default is false.
Definition at line 155 of file page_pool_pimpl.hpp.
Referenced by attach(), initialize_once(), foedus::memory::operator<<(), and uninitialize_once().