From: Dmitry Kurochkin Date: Tue, 19 Apr 2011 05:20:17 +0000 (+0400) Subject: Convert most Segment::mem() calls to reserve(). X-Git-Tag: take06~9 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=2d0647fbfe04fd2071f99f886f2ace875e22599f;p=thirdparty%2Fsquid.git Convert most Segment::mem() calls to reserve(). Now all shared structures properly reserve() memory. --- diff --git a/src/ipc/Queue.cc b/src/ipc/Queue.cc index c192ff3ec2..d7b3269539 100644 --- a/src/ipc/Queue.cc +++ b/src/ipc/Queue.cc @@ -55,6 +55,9 @@ OneToOneUniQueue::OneToOneUniQueue(const String &id): shm(id.termedBuf()), shm.open(); shared = reinterpret_cast(shm.mem()); assert(shared); + const int mySharedSize = + Items2Bytes(shared->theMaxItemSize, shared->theCapacity); + assert(shared == reinterpret_cast(shm.reserve(mySharedSize))); } void diff --git a/src/ipc/mem/PagePool.cc b/src/ipc/mem/PagePool.cc index 4a9ce46ff5..27c4793a36 100644 --- a/src/ipc/mem/PagePool.cc +++ b/src/ipc/mem/PagePool.cc @@ -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(shm.mem()); assert(shared); + const off_t mySharedSize = + Shared::MemSize(shared->theCapacity, shared->thePageSize); + assert(shared == reinterpret_cast(shm.reserve(mySharedSize))); } void diff --git a/src/ipc/mem/PageStack.cc b/src/ipc/mem/PageStack.cc index 30891d0981..4f1a17a66e 100644 --- a/src/ipc/mem/PageStack.cc +++ b/src/ipc/mem/PageStack.cc @@ -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(shm.mem()); assert(shared); + const off_t mySharedSize = Shared::MemSize(shared->theCapacity); + assert(shared == reinterpret_cast(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); +} diff --git a/src/ipc/mem/PageStack.h b/src/ipc/mem/PageStack.h index 20d6a1a3d9..329c425bcc 100644 --- a/src/ipc/mem/PageStack.h +++ b/src/ipc/mem/PageStack.h @@ -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; } diff --git a/src/ipc/mem/Segment.cc b/src/ipc/mem/Segment.cc index fac4b61acd..e217579e3b 100644 --- a/src/ipc/mem/Segment.cc +++ b/src/ipc/mem/Segment.cc @@ -115,11 +115,12 @@ Ipc::Mem::Segment::detach() void * Ipc::Mem::Segment::reserve(size_t chunkSize) { + Must(theMem); // check for overflows assert(static_cast(chunkSize) >= 0); assert(static_cast(chunkSize) <= theSize); assert(theReserved <= theSize - static_cast(chunkSize)); - void *result = reinterpret_cast(mem()) + theReserved; + void *result = reinterpret_cast(theMem) + theReserved; theReserved += chunkSize; return result; } diff --git a/src/ipc/mem/Segment.h b/src/ipc/mem/Segment.h index 415cee1cac..9712144ea1 100644 --- a/src/ipc/mem/Segment.h +++ b/src/ipc/mem/Segment.h @@ -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