⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mem.c

📁 -
💻 C
字号:
/* * $Id: mem.c,v 1.39 1999/01/21 23:15:37 wessels Exp $ * * DEBUG: section 13    High Level Memory Pool Management * AUTHOR: Harvest Derived * * SQUID Internet Object Cache  http://squid.nlanr.net/Squid/ * ---------------------------------------------------------- * *  Squid is the result of efforts by numerous individuals from the *  Internet community.  Development is led by Duane Wessels of the *  National Laboratory for Applied Network Research and funded by the *  National Science Foundation.  Squid is Copyrighted (C) 1998 by *  Duane Wessels and the University of California San Diego.  Please *  see the COPYRIGHT file for full details.  Squid incorporates *  software developed and/or copyrighted by other sources.  Please see *  the CREDITS file for full details. * *  This program is free software; you can redistribute it and/or modify *  it under the terms of the GNU General Public License as published by *  the Free Software Foundation; either version 2 of the License, or *  (at your option) any later version. *   *  This program is distributed in the hope that it will be useful, *  but WITHOUT ANY WARRANTY; without even the implied warranty of *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the *  GNU General Public License for more details. *   *  You should have received a copy of the GNU General Public License *  along with this program; if not, write to the Free Software *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA. * */#include "squid.h"/* module globals */static MemPool *MemPools[MEM_MAX];/* string pools */#define mem_str_pool_count 3static const struct {    const char *name;    size_t obj_size;} StrPoolsAttrs[mem_str_pool_count] = {    {	"Short Strings", 36,    },				/* to fit rfc1123 and similar */    {	"Medium Strings", 128,    },				/* to fit most urls */    {	"Long Strings", 512    }				/* other */};static struct {    MemPool *pool;} StrPools[mem_str_pool_count];static MemMeter StrCountMeter;static MemMeter StrVolumeMeter;/* local routines *//* * we have a limit on _total_ amount of idle memory so we ignore * max_pages for now */static voidmemDataInit(mem_type type, const char *name, size_t size, int max_pages_notused){    assert(name && size);    MemPools[type] = memPoolCreate(name, size);}static voidmemStringStats(StoreEntry * sentry){    const char *pfmt = "%-20s\t %d\t %d\n";    int i;    int pooled_count = 0;    size_t pooled_volume = 0;    /* heading */    storeAppendPrintf(sentry,	"String Pool\t Impact\t\t\n"	" \t (%%strings)\t (%%volume)\n");    /* table body */    for (i = 0; i < mem_str_pool_count; i++) {	const MemPool *pool = StrPools[i].pool;	const int plevel = pool->meter.inuse.level;	storeAppendPrintf(sentry, pfmt,	    pool->label,	    xpercentInt(plevel, StrCountMeter.level),	    xpercentInt(plevel * pool->obj_size, StrVolumeMeter.level));	pooled_count += plevel;	pooled_volume += plevel * pool->obj_size;    }    /* malloc strings */    storeAppendPrintf(sentry, pfmt,	"Other Strings",	xpercentInt(StrCountMeter.level - pooled_count, StrCountMeter.level),	xpercentInt(StrVolumeMeter.level - pooled_volume, StrVolumeMeter.level));}static voidmemStats(StoreEntry * sentry){    storeBuffer(sentry);    memReport(sentry);    memStringStats(sentry);    storeBufferFlush(sentry);}/* * public routines *//* find appropriate pool and use it (pools always init buffer with 0s) */void *memAllocate(mem_type type){    return memPoolAlloc(MemPools[type]);}/* give memory back to the pool */voidmemFree(void *p, int type){    memPoolFree(MemPools[type], p);}/* allocate a variable size buffer using best-fit pool */void *memAllocBuf(size_t net_size, size_t * gross_size){    int i;    MemPool *pool = NULL;    assert(gross_size);    for (i = 0; i < mem_str_pool_count; i++) {	if (net_size <= StrPoolsAttrs[i].obj_size) {	    pool = StrPools[i].pool;	    break;	}    }    *gross_size = pool ? pool->obj_size : net_size;    assert(*gross_size >= net_size);    memMeterInc(StrCountMeter);    memMeterAdd(StrVolumeMeter, *gross_size);    return pool ? memPoolAlloc(pool) : xcalloc(1, net_size);}/* free buffer allocated with memAllocBuf() */voidmemFreeBuf(size_t size, void *buf){    int i;    MemPool *pool = NULL;    assert(size && buf);    for (i = 0; i < mem_str_pool_count; i++) {	if (size <= StrPoolsAttrs[i].obj_size) {	    assert(size == StrPoolsAttrs[i].obj_size);	    pool = StrPools[i].pool;	    break;	}    }    memMeterDec(StrCountMeter);    memMeterDel(StrVolumeMeter, size);    pool ? memPoolFree(pool, buf) : xfree(buf);}voidmemInit(void){    int i;    mem_type t;    memInitModule();    /* set all pointers to null */    memset(MemPools, '\0', sizeof(MemPools));    /*     * it does not hurt much to have a lot of pools since sizeof(MemPool) is     * small; someday we will figure out what to do with all the entries here     * 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_CLIENT_SOCK_BUF, "Client Socket Buffer", CLIENT_SOCK_SZ, 0);    memDataInit(MEM_ACCESSLOGENTRY, "AccessLogEntry",	sizeof(AccessLogEntry), 10);    memDataInit(MEM_ACL, "acl", sizeof(acl), 0);    memDataInit(MEM_ACLCHECK_T, "aclCheck_t", sizeof(aclCheck_t), 0);    memDataInit(MEM_ACL_ACCESS, "acl_access", sizeof(acl_access), 0);    memDataInit(MEM_ACL_DENY_INFO_LIST, "acl_deny_info_list",	sizeof(acl_deny_info_list), 0);    memDataInit(MEM_ACL_IP_DATA, "acl_ip_data", sizeof(acl_ip_data), 0);    memDataInit(MEM_ACL_LIST, "acl_list", sizeof(acl_list), 0);    memDataInit(MEM_ACL_NAME_LIST, "acl_name_list", sizeof(acl_name_list), 0);    memDataInit(MEM_ACL_TIME_DATA, "acl_time_data", sizeof(acl_time_data), 0);    memDataInit(MEM_ACL_PROXY_AUTH_USER, "acl_proxy_auth_user",	sizeof(acl_proxy_auth_user), 0);    memDataInit(MEM_AIO_RESULT_T, "aio_result_t", sizeof(aio_result_t), 0);    memDataInit(MEM_CACHEMGR_PASSWD, "cachemgr_passwd",	sizeof(cachemgr_passwd), 0);#if USE_CACHE_DIGESTS    memDataInit(MEM_CACHE_DIGEST, "CacheDigest", sizeof(CacheDigest), 0);#endif    memDataInit(MEM_CLIENTHTTPREQUEST, "clientHttpRequest",	sizeof(clientHttpRequest), 0);    memDataInit(MEM_CLOSE_HANDLER, "close_handler", sizeof(close_handler), 0);    memDataInit(MEM_COMMWRITESTATEDATA, "CommWriteStateData",	sizeof(CommWriteStateData), 0);    memDataInit(MEM_CONNSTATEDATA, "ConnStateData", sizeof(ConnStateData), 0);#if USE_CACHE_DIGESTS    memDataInit(MEM_DIGEST_FETCH_STATE, "DigestFetchState", sizeof(DigestFetchState), 0);#endif    memDataInit(MEM_DISK_BUF, "Disk I/O Buffer", DISK_PAGE_SIZE, 200);    memDataInit(MEM_DLINK_LIST, "dlink_list", sizeof(dlink_list), 10);    memDataInit(MEM_DLINK_NODE, "dlink_node", sizeof(dlink_node), 10);    memDataInit(MEM_DNSSERVER_T, "dnsserver_t", sizeof(dnsserver_t), 0);    memDataInit(MEM_DNSSTATDATA, "dnsStatData", sizeof(dnsStatData), 0);    memDataInit(MEM_DOMAIN_PING, "domain_ping", sizeof(domain_ping), 0);    memDataInit(MEM_DOMAIN_TYPE, "domain_type", sizeof(domain_type), 0);    memDataInit(MEM_DREAD_CTRL, "dread_ctrl", sizeof(dread_ctrl), 0);    memDataInit(MEM_DWRITE_Q, "dwrite_q", sizeof(dwrite_q), 0);    memDataInit(MEM_ERRORSTATE, "ErrorState", sizeof(ErrorState), 0);    memDataInit(MEM_FILEMAP, "fileMap", sizeof(fileMap), 0);    memDataInit(MEM_FQDNCACHE_ENTRY, "fqdncache_entry",	sizeof(fqdncache_entry), 0);    memDataInit(MEM_FQDNCACHE_PENDING, "fqdn_pending",	sizeof(fqdn_pending), 0);    memDataInit(MEM_FWD_STATE, "FwdState", sizeof(FwdState), 0);    memDataInit(MEM_FWD_SERVER, "FwdServer", sizeof(FwdServer), 0);    memDataInit(MEM_HASH_LINK, "hash_link", sizeof(hash_link), 0);    memDataInit(MEM_HASH_TABLE, "hash_table", sizeof(hash_table), 0);    memDataInit(MEM_HIERARCHYLOGENTRY, "HierarchyLogEntry",	sizeof(HierarchyLogEntry), 0);    memDataInit(MEM_HTTP_STATE_DATA, "HttpStateData", sizeof(HttpStateData), 0);    memDataInit(MEM_HTTP_REPLY, "HttpReply", sizeof(HttpReply), 0);    memDataInit(MEM_HTTP_HDR_ENTRY, "HttpHeaderEntry", sizeof(HttpHeaderEntry), 0);    memDataInit(MEM_HTTP_HDR_CC, "HttpHdrCc", sizeof(HttpHdrCc), 0);    memDataInit(MEM_HTTP_HDR_RANGE_SPEC, "HttpHdrRangeSpec", sizeof(HttpHdrRangeSpec), 0);    memDataInit(MEM_HTTP_HDR_RANGE, "HttpHdrRange", sizeof(HttpHdrRange), 0);    memDataInit(MEM_HTTP_HDR_CONTENT_RANGE, "HttpHdrContRange", sizeof(HttpHdrContRange), 0);    memDataInit(MEM_ICPUDPDATA, "icpUdpData", sizeof(icpUdpData), 0);    memDataInit(MEM_ICP_COMMON_T, "icp_common_t", sizeof(icp_common_t), 0);    memDataInit(MEM_ICP_PING_DATA, "ping_data", sizeof(ping_data), 0);    memDataInit(MEM_INTLIST, "intlist", sizeof(intlist), 0);    memDataInit(MEM_IOSTATS, "iostats", sizeof(iostats), 0);    memDataInit(MEM_IPCACHE_PENDING, "ip_pending", sizeof(ip_pending), 0);    memDataInit(MEM_IPCACHE_ENTRY, "ipcache_entry", sizeof(ipcache_entry), 0);    memDataInit(MEM_MEMOBJECT, "MemObject", sizeof(MemObject),	Squid_MaxFD >> 3);    memDataInit(MEM_MEM_NODE, "mem_node", sizeof(mem_node), 0);    memDataInit(MEM_NETDBENTRY, "netdbEntry", sizeof(netdbEntry), 0);    memDataInit(MEM_NET_DB_NAME, "net_db_name", sizeof(net_db_name), 0);    memDataInit(MEM_NET_DB_PEER, "net_db_peer", sizeof(net_db_peer), 0);    memDataInit(MEM_PEER, "peer", sizeof(peer), 0);#if USE_CACHE_DIGESTS    memDataInit(MEM_PEER_DIGEST, "PeerDigest", sizeof(PeerDigest), 0);    memDataInit(MEM_DIGEST_FETCH_STATE, "DigestFetchState", sizeof(DigestFetchState), 0);#endif    memDataInit(MEM_PINGERECHODATA, "pingerEchoData",	sizeof(pingerEchoData), 0);    memDataInit(MEM_PINGERREPLYDATA, "pingerReplyData",	sizeof(pingerReplyData), 0);    memDataInit(MEM_PS_STATE, "ps_state", sizeof(ps_state), 0);    memDataInit(MEM_REFRESH_T, "refresh_t", sizeof(refresh_t), 0);    memDataInit(MEM_RELIST, "relist", sizeof(relist), 0);    memDataInit(MEM_REQUEST_T, "request_t", sizeof(request_t),	Squid_MaxFD >> 3);    memDataInit(MEM_SQUIDCONFIG, "SquidConfig", sizeof(SquidConfig), 0);    memDataInit(MEM_SQUIDCONFIG2, "SquidConfig2", sizeof(SquidConfig2), 0);    memDataInit(MEM_STATCOUNTERS, "StatCounters", sizeof(StatCounters), 0);    memDataInit(MEM_STMEM_BUF, "Store Mem Buffer", SM_PAGE_SIZE,	Config.memMaxSize / SM_PAGE_SIZE);    memDataInit(MEM_STOREENTRY, "StoreEntry", sizeof(StoreEntry), 0);    memDataInit(MEM_STORE_CLIENT, "store_client", sizeof(store_client), 0);    memDataInit(MEM_SWAPDIR, "SwapDir", sizeof(SwapDir), 0);    memDataInit(MEM_USHORTLIST, "ushort_list", sizeof(ushortlist), 0);    memDataInit(MEM_WORDLIST, "wordlist", sizeof(wordlist), 0);    memDataInit(MEM_CLIENT_INFO, "ClientInfo", sizeof(ClientInfo), 0);    memDataInit(MEM_MD5_DIGEST, "MD5 digest", MD5_DIGEST_CHARS, 0);    memDataInit(MEM_HELPER, "helper", sizeof(helper), 0);    memDataInit(MEM_HELPER_REQUEST, "helper_request",	sizeof(helper_request), 0);    memDataInit(MEM_HELPER_SERVER, "helper_server",	sizeof(helper_server), 0);    /* test that all entries are initialized */    for (t = MEM_NONE, t++; t < MEM_MAX; t++) {	if (MEM_DONTFREE == t)	    continue;	/*	 * If you hit this assertion, then you forgot to add a	 * memDataInit() line for type 't'.	 */	assert(MemPools[t]);    }    /* init string pools */    for (i = 0; i < mem_str_pool_count; i++) {	StrPools[i].pool = memPoolCreate(StrPoolsAttrs[i].name, StrPoolsAttrs[i].obj_size);    }    cachemgrRegister("mem",	"Memory Utilization",	memStats, 0, 1);}voidmemClean(){    memCleanModule();}intmemInUse(mem_type type){    return memPoolInUseCount(MemPools[type]);}/* ick */voidmemFree2K(void *p){    memFree(p, MEM_2K_BUF);}voidmemFree4K(void *p){    memFree(p, MEM_4K_BUF);}voidmemFree8K(void *p){    memFree(p, MEM_8K_BUF);}voidmemFreeDISK(void *p){    memFree(p, MEM_DISK_BUF);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -