Skip to content

Commit 310f089

Browse files
committed
allow concurrency for getpage()
1 parent 85de66e commit 310f089

File tree

2 files changed

+10
-3
lines changed

2 files changed

+10
-3
lines changed

src/MemoryPagesPool.cxx

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -149,13 +149,22 @@ MemoryPagesPool::~MemoryPagesPool()
149149

150150
void* MemoryPagesPool::getPage()
151151
{
152+
// disable concurrent execution of this function
153+
std::unique_lock<std::mutex> lock(pagesAvailableMutexPop);
154+
152155
// update statistics
153156
poolStats.set((CounterValue)getNumberOfPagesAvailable());
154157

155158
// get a page from fifo, if available
156159
void* ptr = nullptr;
157160
pagesAvailable->pop(ptr);
158161

162+
// udpate buffer state
163+
updateBufferState();
164+
165+
// the following does not need exclusive access, release lock
166+
lock.unlock();
167+
159168
// stats
160169
if (MemoryPagesPoolStatsEnabled) {
161170
if (ptr != nullptr) {
@@ -172,9 +181,6 @@ void* MemoryPagesPool::getPage()
172181
}
173182
}
174183

175-
// udpate buffer state
176-
updateBufferState();
177-
178184
return ptr;
179185
}
180186

src/MemoryPagesPool.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@ class MemoryPagesPool
9797

9898
std::unique_ptr<AliceO2::Common::Fifo<void*>> pagesAvailable; // a buffer to keep track of individual pages
9999
std::mutex pagesAvailableMutexPush; // a lock to avoid concurrent push-back of free pages to fifo
100+
std::mutex pagesAvailableMutexPop; // a lock to avoid concurrent get free pages from fifo
100101

101102
size_t numberOfPages; // number of pages
102103
size_t pageSize; // size of each page, in bytes

0 commit comments

Comments
 (0)