11#include " MemoryPagesPool.h"
22
3- MemoryPagesPool::MemoryPagesPool (size_t vPageSize, size_t vNumberOfPages, void *vBaseAddress, size_t vBaseSize, ReleaseCallback vCallback) {
3+ MemoryPagesPool::MemoryPagesPool (size_t vPageSize, size_t vNumberOfPages, void *vBaseAddress, size_t vBaseSize, ReleaseCallback vCallback, size_t pageAlign) {
4+ // initialize members from parameters
45 pageSize=vPageSize;
56 numberOfPages=vNumberOfPages;
67 baseBlockAddress=vBaseAddress;
78 baseBlockSize=vBaseSize;
8- releaseBaseBlockCallback=vCallback;
9-
10- size_t sizeNeeded=pageSize * numberOfPages;
9+ releaseBaseBlockCallback=vCallback;
10+
11+ // if not specified, assuming base block size big enough to fit number of pages * page size
12+ if (baseBlockSize==0 ) {
13+ baseBlockSize=pageSize * numberOfPages;
14+ }
15+
16+ // compute offset of first page to ensure aligned as requested
17+ size_t offsetFirstPage=0 ;
18+ if (pageAlign) {
19+ size_t bytesExcess=((size_t )vBaseAddress) % pageAlign;
20+ if (bytesExcess) {
21+ offsetFirstPage=pageAlign-bytesExcess;
22+ }
23+ }
1124
12- if (vBaseSize== 0 ) {
13- baseBlockSize= sizeNeeded;
14- } else if (sizeNeeded>vBaseSize ) {
15- numberOfPages=baseBlockSize/pageSize;
25+ // if necessary, reduce number of pages to fit in available space
26+ size_t sizeNeeded=pageSize * numberOfPages + offsetFirstPage ;
27+ if (sizeNeeded>baseBlockSize ) {
28+ numberOfPages=( baseBlockSize-offsetFirstPage) /pageSize;
1629 }
1730
31+ // create a fifo and store list of pages available
1832 pagesAvailable=std::make_unique<AliceO2::Common::Fifo<void *>>(numberOfPages);
1933 for (size_t i=0 ; i<numberOfPages; i++) {
20- void *ptr=&((char *)baseBlockAddress)[i*pageSize];
34+ void *ptr=&((char *)baseBlockAddress)[offsetFirstPage+ i*pageSize];
2135 pagesAvailable->push (ptr);
2236 }
2337}
2438
2539MemoryPagesPool::~MemoryPagesPool () {
40+ // if defined, use provided callback to release base block
2641 if ( (releaseBaseBlockCallback != nullptr ) && (baseBlockAddress!=nullptr ) ) {
2742 releaseBaseBlockCallback (baseBlockAddress);
2843 }
2944}
3045
3146void *MemoryPagesPool::getPage () {
47+ // get a page from fifo, if available
3248 void *ptr=nullptr ;
3349 pagesAvailable->pop (ptr);
3450 return ptr;
3551}
3652
3753void MemoryPagesPool::releasePage (void *address) {
54+ // put back page in list of available pages
3855 pagesAvailable->push (address);
3956}
4057
@@ -57,8 +74,8 @@ size_t MemoryPagesPool::getBaseBlockSize() {
5774 return baseBlockSize;
5875}
5976
60-
6177std::shared_ptr<DataBlockContainer> MemoryPagesPool::getNewDataBlockContainer (void *newPage) {
78+ // get a new page if none provided
6279 if (newPage==nullptr ) {
6380 // get a new page from the pool
6481 newPage=getPage ();
@@ -67,7 +84,8 @@ std::shared_ptr<DataBlockContainer> MemoryPagesPool::getNewDataBlockContainer(vo
6784 }
6885 }
6986
70- // fill header
87+ // fill header at beginning of page
88+ // assuming payload is contiguous after header
7189 DataBlock *b=(DataBlock *)newPage;
7290 b->header .blockType =DataBlockType::H_BASE;
7391 b->header .headerSize =sizeof (DataBlockHeaderBase);
0 commit comments