From: adrian <> Date: Thu, 7 Feb 2008 09:51:06 +0000 (+0000) Subject: Author: adrian X-Git-Tag: BASIC_TPROXY4~141 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=60da11d303060d0b3a54bc52b132818a32b0438a;p=thirdparty%2Fsquid.git Author: adrian Extend the Memory Allocator infrastructure to not need to zero buffers. --- diff --git a/include/MemPool.h b/include/MemPool.h index 3c12194515..8d524f2aaa 100644 --- a/include/MemPool.h +++ b/include/MemPool.h @@ -110,11 +110,14 @@ public: virtual char const *objectType() const; virtual size_t objectSize() const = 0; virtual int getInUseCount() = 0; + void zeroOnPush(bool doIt); int inUseCount(); virtual void setChunkSize(size_t chunksize) {} // smallest size divisible by sizeof(void*) and at least minSize static size_t RoundedSize(size_t minSize); +protected: + bool doZeroOnPush; private: const char *label; }; diff --git a/lib/MemPool.cc b/lib/MemPool.cc index 5983aafb45..a833d0230a 100644 --- a/lib/MemPool.cc +++ b/lib/MemPool.cc @@ -1,6 +1,6 @@ /* - * $Id: MemPool.cc,v 1.11 2008/01/07 15:47:08 hno Exp $ + * $Id: MemPool.cc,v 1.12 2008/02/07 02:51:13 adrian Exp $ * * DEBUG: section 63 Low Level Memory Pool Management * AUTHOR: Alex Rousskov, Andres Kroonmaa, Robert Collins @@ -273,7 +273,8 @@ MemPool::push(void *obj) * not really need to be cleared.. There was a condition based on * the object size here, but such condition is not safe. */ - memset(obj, 0, obj_size); + if (doZeroOnPush) + memset(obj, 0, obj_size); Free = (void **)obj; *Free = freeCache; freeCache = obj; @@ -838,7 +839,7 @@ memPoolGetGlobalStats(MemPoolGlobalStats * stats) return pools_inuse; } -MemAllocator::MemAllocator(char const *aLabel) : label(aLabel) +MemAllocator::MemAllocator(char const *aLabel) : doZeroOnPush(true), label(aLabel) { } @@ -938,6 +939,12 @@ MemImplementingAllocator::MemImplementingAllocator(char const *aLabel, size_t aS { } +void +MemAllocator::zeroOnPush(bool doIt) +{ + doZeroOnPush = doIt; +} + MemPoolMeter const & MemImplementingAllocator::getMeter() const { diff --git a/src/mem.cc b/src/mem.cc index 8d4b005243..9f0bce2d3d 100644 --- a/src/mem.cc +++ b/src/mem.cc @@ -1,6 +1,6 @@ /* - * $Id: mem.cc,v 1.107 2008/01/22 17:13:36 rousskov Exp $ + * $Id: mem.cc,v 1.108 2008/02/07 02:51:17 adrian Exp $ * * DEBUG: section 13 High Level Memory Pool Management * AUTHOR: Harvest Derived @@ -165,11 +165,12 @@ Mem::Stats(StoreEntry * sentry) * max_pages for now */ void -memDataInit(mem_type type, const char *name, size_t size, int max_pages_notused) +memDataInit(mem_type type, const char *name, size_t size, int max_pages_notused, bool zeroOnPush) { assert(name && size); assert(MemPools[type] == NULL); MemPools[type] = memPoolCreate(name, size); + MemPools[type]->zeroOnPush(zeroOnPush); } @@ -391,12 +392,12 @@ Mem::Init(void) * that are never used or used only once; perhaps we should simply use * malloc() for those? @?@ */ - memDataInit(MEM_2K_BUF, "2K Buffer", 2048, 10); - memDataInit(MEM_4K_BUF, "4K Buffer", 4096, 10); - memDataInit(MEM_8K_BUF, "8K Buffer", 8192, 10); - memDataInit(MEM_16K_BUF, "16K Buffer", 16384, 10); - memDataInit(MEM_32K_BUF, "32K Buffer", 32768, 10); - memDataInit(MEM_64K_BUF, "64K Buffer", 65536, 10); + memDataInit(MEM_2K_BUF, "2K Buffer", 2048, 10, false); + memDataInit(MEM_4K_BUF, "4K Buffer", 4096, 10, false); + memDataInit(MEM_8K_BUF, "8K Buffer", 8192, 10, false); + memDataInit(MEM_16K_BUF, "16K Buffer", 16384, 10, false); + memDataInit(MEM_32K_BUF, "32K Buffer", 32768, 10, false); + memDataInit(MEM_64K_BUF, "64K Buffer", 65536, 10, false); memDataInit(MEM_ACL_DENY_INFO_LIST, "acl_deny_info_list", sizeof(acl_deny_info_list), 0); memDataInit(MEM_ACL_NAME_LIST, "acl_name_list", sizeof(acl_name_list), 0); @@ -422,6 +423,7 @@ Mem::Init(void) for (i = 0; i < mem_str_pool_count; i++) { StrPools[i].pool = memPoolCreate(StrPoolsAttrs[i].name, StrPoolsAttrs[i].obj_size); + StrPools[i].pool->zeroOnPush(false); if (StrPools[i].pool->objectSize() != StrPoolsAttrs[i].obj_size) debugs(13, 1, "Notice: " << StrPoolsAttrs[i].name << " is " << StrPools[i].pool->objectSize() << " bytes instead of requested " << StrPoolsAttrs[i].obj_size << " bytes"); diff --git a/src/protos.h b/src/protos.h index 6b6d742f6b..0e1e76ed3d 100644 --- a/src/protos.h +++ b/src/protos.h @@ -1,6 +1,6 @@ /* - * $Id: protos.h,v 1.554 2008/01/24 19:20:43 serassio Exp $ + * $Id: protos.h,v 1.555 2008/02/07 02:51:18 adrian Exp $ * * * SQUID Web Proxy Cache http://www.squid-cache.org/ @@ -496,7 +496,7 @@ SQUIDCEXTERN void memFreeString(size_t size, void *); SQUIDCEXTERN void memFreeBuf(size_t size, void *); SQUIDCEXTERN FREE *memFreeBufFunc(size_t size); SQUIDCEXTERN int memInUse(mem_type); -SQUIDCEXTERN void memDataInit(mem_type, const char *, size_t, int); +SQUIDCEXTERN void memDataInit(mem_type, const char *, size_t, int, bool zeroOnPush = true); SQUIDCEXTERN void memCheckInit(void);