]> git.ipfire.org Git - thirdparty/squid.git/commitdiff
Convert most Segment::mem() calls to reserve().
authorDmitry Kurochkin <dmitry.kurochkin@measurement-factory.com>
Tue, 19 Apr 2011 05:20:17 +0000 (09:20 +0400)
committerDmitry Kurochkin <dmitry.kurochkin@measurement-factory.com>
Tue, 19 Apr 2011 05:20:17 +0000 (09:20 +0400)
Now all shared structures properly reserve() memory.

src/ipc/Queue.cc
src/ipc/mem/PagePool.cc
src/ipc/mem/PageStack.cc
src/ipc/mem/PageStack.h
src/ipc/mem/Segment.cc
src/ipc/mem/Segment.h

index c192ff3ec212e83fc44800891048881aa4faa95e..d7b326953989943d2b762c6a25d329ae794a2c82 100644 (file)
@@ -55,6 +55,9 @@ OneToOneUniQueue::OneToOneUniQueue(const String &id): shm(id.termedBuf()),
     shm.open();
     shared = reinterpret_cast<Shared *>(shm.mem());
     assert(shared);
+    const int mySharedSize =
+        Items2Bytes(shared->theMaxItemSize, shared->theCapacity);
+    assert(shared == reinterpret_cast<Shared *>(shm.reserve(mySharedSize)));
 }
 
 void
index 4a9ce46ff5694bd57de051ad5426da4972014412..27c4793a3680975fc423504d5b28fe49b4288a23 100644 (file)
@@ -25,9 +25,10 @@ Ipc::Mem::PagePool::PagePool(const String &id, const unsigned int capacity, cons
     pageIndex(PageIndexId(id), capacity),
     shm(id.termedBuf())
 {
-    shm.create(Shared::MemSize(capacity, pageSize));
+    const off_t mySharedSize = Shared::MemSize(capacity, pageSize);
+    shm.create(mySharedSize);
     assert(shm.mem());
-    shared = new (shm.mem()) Shared(capacity, pageSize);
+    shared = new (shm.reserve(mySharedSize)) Shared(capacity, pageSize);
 }
 
 Ipc::Mem::PagePool::PagePool(const String &id):
@@ -36,6 +37,9 @@ Ipc::Mem::PagePool::PagePool(const String &id):
     shm.open();
     shared = reinterpret_cast<Shared *>(shm.mem());
     assert(shared);
+    const off_t mySharedSize =
+        Shared::MemSize(shared->theCapacity, shared->thePageSize);
+    assert(shared == reinterpret_cast<Shared *>(shm.reserve(mySharedSize)));
 }
 
 void
index 30891d0981bdd037b9eaf01dbcd31e2553736be2..4f1a17a66ec5f04571f4d4b8810400405f5707bf 100644 (file)
@@ -17,9 +17,10 @@ const Ipc::Mem::PageStack::Value Writable = 0;
 Ipc::Mem::PageStack::PageStack(const String &id, const unsigned int capacity):
     shm(id.termedBuf())
 {
-    shm.create(sizeof(Shared::Item) * capacity + sizeof(Shared));
+    const size_t mySharedSize = Shared::MemSize(capacity);
+    shm.create(mySharedSize);
     assert(shm.mem());
-    shared = new (shm.mem()) Shared(capacity);
+    shared = new (shm.reserve(mySharedSize)) Shared(capacity);
 }
 
 Ipc::Mem::PageStack::PageStack(const String &id): shm(id.termedBuf())
@@ -27,6 +28,8 @@ Ipc::Mem::PageStack::PageStack(const String &id): shm(id.termedBuf())
     shm.open();
     shared = reinterpret_cast<Shared *>(shm.mem());
     assert(shared);
+    const off_t mySharedSize = Shared::MemSize(shared->theCapacity);
+    assert(shared == reinterpret_cast<Shared *>(shm.reserve(mySharedSize)));
 }
 
 void
@@ -108,3 +111,9 @@ Ipc::Mem::PageStack::Shared::Shared(const unsigned int aCapacity):
     for (Offset i = 0; i < theSize; ++i)
         theItems[i] = i + 1; // skip page number zero to keep numbers positive
 }
+
+size_t
+Ipc::Mem::PageStack::Shared::MemSize(const unsigned int capacity)
+{
+    return sizeof(Item) * capacity + sizeof(Shared);
+}
index 20d6a1a3d98160cd149f4df3730037f2407a4ac4..329c425bcc148bf5ff042d75f098cced8715a75c 100644 (file)
@@ -42,6 +42,9 @@ private:
     struct Shared {
         Shared(const unsigned int aCapacity);
 
+        /// total shared memory size required to share
+        static size_t MemSize(const unsigned int capacity);
+
         // these help iterate the stack in search of a free spot or a page
         Offset next(const Offset idx) const { return (idx + 1) % theCapacity; }
         Offset prev(const Offset idx) const { return (theCapacity + idx - 1) % theCapacity; }
index fac4b61acddebf3361fba33e2519d15bbd8e8df3..e217579e3b0767fc2b535bbfbba8d3a0aa183ad4 100644 (file)
@@ -115,11 +115,12 @@ Ipc::Mem::Segment::detach()
 void *
 Ipc::Mem::Segment::reserve(size_t chunkSize)
 {
+    Must(theMem);
     // check for overflows
     assert(static_cast<off_t>(chunkSize) >= 0);
     assert(static_cast<off_t>(chunkSize) <= theSize);
     assert(theReserved <= theSize - static_cast<off_t>(chunkSize));
-    void *result = reinterpret_cast<char*>(mem()) + theReserved;
+    void *result = reinterpret_cast<char*>(theMem) + theReserved;
     theReserved += chunkSize;
     return result;
 }
index 415cee1cacb59bf0db1197a21373966290c27653..9712144ea16edc547657d924a51aa63d6b90ba98 100644 (file)
@@ -26,9 +26,8 @@ public:
 
     const String &name() { return theName; } ///< shared memory segment name
     off_t size() { return theSize; } ///< shared memory segment size
-    void *mem() { return theMem; } ///< pointer to mmapped shared memory segment
+    void *mem() { return reserve(0); } ///< pointer to the next chunk
     void *reserve(size_t chunkSize); ///< reserve and return the next chunk
-    // TODO: convert most mem() calls to reserve()
 
     static void Unlink(const char *const id); ///< unlink the segment