pageIndex(shm_old(PageStack)(id)),
theLevels(reinterpret_cast<Levels_t *>(
reinterpret_cast<char *>(pageIndex.getRaw()) +
- pageIndex->stackSize())),
+ pageIndex->stackSize() + pageIndex->levelsPaddingSize())),
theBuf(reinterpret_cast<char *>(theLevels + PageId::maxPurpose))
{
}
private:
Ipc::Mem::Pointer<PageStack> pageIndex; ///< free pages index
- typedef std::atomic<size_t> Levels_t;
+ using Levels_t = PageStack::Levels_t;
+
/// number of shared memory pages used now for each purpose
Levels_t * const theLevels;
char *const theBuf; ///< pages storage
{
const size_t levelsSize = PageId::maxPurpose * sizeof(std::atomic<Ipc::Mem::PageStack::Value>);
const size_t pagesDataSize = capacity * pageSize;
- return StackSize(capacity) + pagesDataSize + levelsSize;
+ return StackSize(capacity) + LevelsPaddingSize(capacity) + levelsSize + pagesDataSize;
}
size_t
return StackSize(theCapacity);
}
+size_t
+Ipc::Mem::PageStack::LevelsPaddingSize(const unsigned int capacity)
+{
+ const auto displacement = StackSize(capacity) % alignof(Levels_t);
+ return displacement ? alignof(Levels_t) - displacement : 0;
+}
+
{
public:
typedef uint32_t Value; ///< stack item type (a free page number)
+ typedef std::atomic<size_t> Levels_t;
PageStack(const uint32_t aPoolId, const unsigned int aCapacity, const size_t aPageSize);
static size_t StackSize(const unsigned int capacity);
size_t stackSize() const;
+ /// \returns the number of padding bytes to align PagePool::theLevels array
+ static size_t LevelsPaddingSize(const unsigned int capacity);
+ size_t levelsPaddingSize() const { return LevelsPaddingSize(theCapacity); }
+
private:
/// stack index and size type (may temporary go negative)
typedef int Offset;