]> git.ipfire.org Git - thirdparty/squid.git/blobdiff - src/ipc/mem/PagePool.cc
SourceFormat Enforcement
[thirdparty/squid.git] / src / ipc / mem / PagePool.cc
index 843b28f1aea1334887af23a6fec63ec20a151d1e..7753d37bee7cbfe0e6c6802ea0018667f84dcbac 100644 (file)
@@ -1,16 +1,18 @@
 /*
- * $Id$
- *
- * DEBUG: section 54    Interprocess Communication
+ * Copyright (C) 1996-2015 The Squid Software Foundation and contributors
  *
+ * Squid software is distributed under GPLv2+ license and includes
+ * contributions from numerous individuals and organizations.
+ * Please see the COPYING and CONTRIBUTORS files for details.
  */
 
-#include "config.h"
+/* DEBUG: section 54    Interprocess Communication */
+
+#include "squid.h"
 #include "base/TextException.h"
 #include "ipc/mem/Page.h"
 #include "ipc/mem/PagePool.h"
 
-
 // Ipc::Mem::PagePool
 
 Ipc::Mem::PagePool::Owner *
@@ -23,11 +25,43 @@ Ipc::Mem::PagePool::Init(const char *const id, const unsigned int capacity, cons
 }
 
 Ipc::Mem::PagePool::PagePool(const char *const id):
-    pageIndex(shm_old(PageStack)(id))
+    pageIndex(shm_old(PageStack)(id)),
+    theLevels(reinterpret_cast<Atomic::Word *>(
+                  reinterpret_cast<char *>(pageIndex.getRaw()) +
+                  pageIndex->stackSize())),
+    theBuf(reinterpret_cast<char *>(theLevels + PageId::maxPurpose))
+{
+}
+
+size_t
+Ipc::Mem::PagePool::level(const int purpose) const
+{
+    Must(0 <= purpose && purpose < PageId::maxPurpose);
+    return theLevels[purpose];
+}
+
+bool
+Ipc::Mem::PagePool::get(const PageId::Purpose purpose, PageId &page)
 {
-    const size_t pagesDataOffset =
-        pageIndex->sharedMemorySize() - capacity() * pageSize();
-    theBuf = reinterpret_cast<char *>(pageIndex.getRaw()) + pagesDataOffset;
+    Must(0 <= purpose && purpose < PageId::maxPurpose);
+    if (pageIndex->pop(page)) {
+        page.purpose = purpose;
+        ++theLevels[purpose];
+        return true;
+    }
+    return false;
+}
+
+void
+Ipc::Mem::PagePool::put(PageId &page)
+{
+    if (!page)
+        return;
+
+    Must(0 <= page.purpose && page.purpose < PageId::maxPurpose);
+    --theLevels[page.purpose];
+    page.purpose = PageId::maxPurpose;
+    return pageIndex->push(page);
 }
 
 char *
@@ -36,3 +70,4 @@ Ipc::Mem::PagePool::pagePointer(const PageId &page)
     Must(pageIndex->pageIdIsValid(page));
     return theBuf + pageSize() * (page.number - 1);
 }
+