]> git.ipfire.org Git - thirdparty/squid.git/blame - src/ipc/mem/PagePool.cc
Renamed squid.h to squid-old.h and config.h to squid.h
[thirdparty/squid.git] / src / ipc / mem / PagePool.cc
CommitLineData
3e0ddf16
AR
1/*
2 * $Id$
3 *
4 * DEBUG: section 54 Interprocess Communication
5 *
6 */
7
f7f3304a 8#include "squid.h"
56f8aa50
DK
9#include "base/TextException.h"
10#include "ipc/mem/Page.h"
3e0ddf16
AR
11#include "ipc/mem/PagePool.h"
12
56f8aa50 13
56f8aa50
DK
14// Ipc::Mem::PagePool
15
68353d5a
DK
16Ipc::Mem::PagePool::Owner *
17Ipc::Mem::PagePool::Init(const char *const id, const unsigned int capacity, const size_t pageSize)
56f8aa50 18{
68353d5a
DK
19 static uint32_t LastPagePoolId = 0;
20 if (++LastPagePoolId == 0)
21 ++LastPagePoolId; // skip zero pool id
22 return shm_new(PageStack)(id, LastPagePoolId, capacity, pageSize);
56f8aa50
DK
23}
24
68353d5a 25Ipc::Mem::PagePool::PagePool(const char *const id):
9199139f 26 pageIndex(shm_old(PageStack)(id)),
794d4c0c 27 theLevels(reinterpret_cast<Atomic::Word *>(
9199139f
AR
28 reinterpret_cast<char *>(pageIndex.getRaw()) +
29 pageIndex->stackSize())),
30 theBuf(reinterpret_cast<char *>(theLevels + PageId::maxPurpose))
56f8aa50 31{
551f8a18
DK
32}
33
34size_t
35Ipc::Mem::PagePool::level(const int purpose) const
36{
37 Must(0 <= purpose && purpose < PageId::maxPurpose);
38 return theLevels[purpose];
39}
40
41bool
42Ipc::Mem::PagePool::get(const PageId::Purpose purpose, PageId &page)
43{
44 Must(0 <= purpose && purpose < PageId::maxPurpose);
45 if (pageIndex->pop(page)) {
46 page.purpose = purpose;
47 ++theLevels[purpose];
48 return true;
49 }
50 return false;
51}
52
53void
54Ipc::Mem::PagePool::put(PageId &page)
55{
56 if (!page)
57 return;
58
59 Must(0 <= page.purpose && page.purpose < PageId::maxPurpose);
60 --theLevels[page.purpose];
61 page.purpose = PageId::maxPurpose;
62 return pageIndex->push(page);
56f8aa50
DK
63}
64
8ed94021 65char *
56f8aa50
DK
66Ipc::Mem::PagePool::pagePointer(const PageId &page)
67{
68353d5a
DK
68 Must(pageIndex->pageIdIsValid(page));
69 return theBuf + pageSize() * (page.number - 1);
39c0d994 70}