亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? mempool.c

?? -
?? C
字號:
/* * $Id: MemPool.c,v 1.20 1999/01/19 20:43:45 wessels Exp $ * * DEBUG: section 63    Low Level Memory Pool Management * AUTHOR: Alex Rousskov * * 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"#include "Stack.h"#define MB ((size_t)1024*1024)/* module globals *//* huge constant to set mem_idle_limit to "unlimited" */static const size_t mem_unlimited_size = 2 * 1024 * MB;/* we cannot keep idle more than this limit */static size_t mem_idle_limit = 0;/* memory pool accounting */static MemPoolMeter TheMeter;static gb_t mem_traffic_volume ={0, 0};static Stack Pools;/* local prototypes */static void memShrink(size_t new_limit);static void memPoolDescribe(const MemPool * pool);static void memPoolShrink(MemPool * pool, size_t new_limit);static doubletoMB(size_t size){    return ((double) size) / MB;}static size_ttoKB(size_t size){    return (size + 1024 - 1) / 1024;}/* Initialization */voidmemConfigure(void){    size_t new_pool_limit = mem_idle_limit;    /* set to configured value first */#if PURIFY    debug(63, 1) ("Disabling Memory pools under purify\n");    Config.onoff.mem_pools = 0;#endif    if (!Config.onoff.mem_pools)	new_pool_limit = 0;    else if (Config.MemPools.limit > 0)	new_pool_limit = Config.MemPools.limit;    else	new_pool_limit = mem_unlimited_size;    /* shrink memory pools if needed */    if (TheMeter.idle.level > new_pool_limit) {	debug(63, 1) ("Shrinking idle mem pools to %.2f MB\n", toMB(new_pool_limit));	memShrink(new_pool_limit);    }    assert(TheMeter.idle.level <= new_pool_limit);    mem_idle_limit = new_pool_limit;}voidmemInitModule(void){    memset(&TheMeter, 0, sizeof(TheMeter));    stackInit(&Pools);    debug(63, 1) ("Memory pools are '%s'; limit: %.2f MB\n",	(Config.onoff.mem_pools ? "on" : "off"), toMB(mem_idle_limit));}voidmemCleanModule(void){    int i;    int dirty_count = 0;    for (i = 0; i < Pools.count; i++) {	MemPool *pool = Pools.items[i];	if (memPoolInUseCount(pool)) {	    memPoolDescribe(pool);	    dirty_count++;	} else {	    memPoolDestroy(pool);	    Pools.items[i] = NULL;	}    }    if (dirty_count)	debug(63, 2) ("memCleanModule: %d pools are left dirty\n", dirty_count);    /* we clean the stack anyway */    stackClean(&Pools);}static voidmemShrink(size_t new_limit){    size_t start_limit = TheMeter.idle.level;    int i;    assert(start_limit >= 0 && new_limit >= 0);    debug(63, 1) ("memShrink: started with %d KB goal: %d KB\n",	toKB(TheMeter.idle.level), toKB(new_limit));    /* first phase: cut proportionally to the pool idle size */    for (i = 0; i < Pools.count && TheMeter.idle.level > new_limit; ++i) {	MemPool *pool = Pools.items[i];	const size_t target_pool_size = (size_t) ((double) pool->meter.idle.level * new_limit) / start_limit;	memPoolShrink(pool, target_pool_size);    }    debug(63, 1) ("memShrink: 1st phase done with %d KB left\n", toKB(TheMeter.idle.level));    /* second phase: cut to 0 */    for (i = 0; i < Pools.count && TheMeter.idle.level > new_limit; ++i)	memPoolShrink(Pools.items[i], 0);    debug(63, 1) ("memShrink: 2nd phase done with %d KB left\n", toKB(TheMeter.idle.level));    assert(TheMeter.idle.level <= new_limit);	/* paranoid */}/* MemPoolMeter */static voidmemPoolMeterReport(const MemPoolMeter * pm, size_t obj_size,    int alloc_count, int inuse_count, int idle_count, StoreEntry * e){    assert(pm);    storeAppendPrintf(e, "%d\t %d\t %d\t %.2f\t %d\t %d\t %d\t %d\t %d\t %d\t %d\t %d\t %d\t %d\t %d\n",    /* alloc */	alloc_count,	toKB(obj_size * pm->alloc.level),	toKB(obj_size * pm->alloc.hwater_level),	(double) ((squid_curtime - pm->alloc.hwater_stamp) / 3600.),	xpercentInt(obj_size * pm->alloc.level, TheMeter.alloc.level),    /* in use */	inuse_count,	toKB(obj_size * pm->inuse.level),	toKB(obj_size * pm->inuse.hwater_level),	xpercentInt(pm->inuse.level, pm->alloc.level),    /* idle */	idle_count,	toKB(obj_size * pm->idle.level),	toKB(obj_size * pm->idle.hwater_level),    /* (int)rint(xpercent(pm->idle.level, pm->alloc.level)), */    /* saved */	xpercentInt(pm->saved.count, mem_traffic_volume.count),	xpercentInt(obj_size * gb_to_double(&pm->saved), gb_to_double(&mem_traffic_volume)),	xpercentInt(pm->saved.count, pm->total.count));}/* MemMeter */voidmemMeterSyncHWater(MemMeter * m){    assert(m);    if (m->hwater_level < m->level) {	m->hwater_level = m->level;	m->hwater_stamp = squid_curtime;    }}/* MemPool */MemPool *memPoolCreate(const char *label, size_t obj_size){    MemPool *pool = xcalloc(1, sizeof(MemPool));    assert(label && obj_size);    pool->label = label;    pool->obj_size = obj_size;    stackInit(&pool->pstack);    /* other members are set to 0 */    stackPush(&Pools, pool);    return pool;}/* * warning: we do not clean this entry from Pools stack assuming memPoolDestroy * is used at the end of the program only */voidmemPoolDestroy(MemPool * pool){    assert(pool);    stackClean(&pool->pstack);    xfree(pool);}void *memPoolAlloc(MemPool * pool){    assert(pool);    memMeterInc(pool->meter.inuse);    gb_inc(&pool->meter.total, 1);    gb_inc(&TheMeter.total, pool->obj_size);    memMeterAdd(TheMeter.inuse, pool->obj_size);    gb_inc(&mem_traffic_volume, pool->obj_size);    if (pool->pstack.count) {	assert(pool->meter.idle.level);	memMeterDec(pool->meter.idle);	memMeterDel(TheMeter.idle, pool->obj_size);	gb_inc(&pool->meter.saved, 1);	gb_inc(&TheMeter.saved, pool->obj_size);	return stackPop(&pool->pstack);    } else {	assert(!pool->meter.idle.level);	memMeterInc(pool->meter.alloc);	memMeterAdd(TheMeter.alloc, pool->obj_size);	return xcalloc(1, pool->obj_size);    }}voidmemPoolFree(MemPool * pool, void *obj){    assert(pool && obj);    memMeterDec(pool->meter.inuse);    memMeterDel(TheMeter.inuse, pool->obj_size);    if (TheMeter.idle.level + pool->obj_size <= mem_idle_limit) {	memMeterInc(pool->meter.idle);	memMeterAdd(TheMeter.idle, pool->obj_size);	memset(obj, 0, pool->obj_size);	stackPush(&pool->pstack, obj);    } else {	memMeterDec(pool->meter.alloc);	memMeterDel(TheMeter.alloc, pool->obj_size);	xfree(obj);    }    assert(pool->meter.idle.level <= pool->meter.alloc.level);}static voidmemPoolShrink(MemPool * pool, size_t new_limit){    assert(pool);    assert(new_limit >= 0);    while (pool->meter.idle.level > new_limit && pool->pstack.count > 0) {	memMeterDec(pool->meter.alloc);	memMeterDec(pool->meter.idle);	memMeterDel(TheMeter.idle, pool->obj_size);	memMeterDel(TheMeter.alloc, pool->obj_size);	xfree(stackPop(&pool->pstack));    }    assert(pool->meter.idle.level <= new_limit);	/* paranoid */}intmemPoolWasUsed(const MemPool * pool){    assert(pool);    return pool->meter.alloc.hwater_level > 0;}intmemPoolInUseCount(const MemPool * pool){    assert(pool);    return pool->meter.inuse.level;}size_tmemPoolInUseSize(const MemPool * pool){    assert(pool);    return pool->obj_size * pool->meter.inuse.level;}/* to-do: make debug level a parameter? */static voidmemPoolDescribe(const MemPool * pool){    assert(pool);    debug(63, 2) ("%-20s: %6d x %4d bytes = %5d KB\n",	pool->label, memPoolInUseCount(pool), pool->obj_size,	toKB(memPoolInUseSize(pool)));}size_tmemTotalAllocated(void){    return TheMeter.alloc.level;}voidmemPoolReport(const MemPool * pool, StoreEntry * e){    assert(pool);    storeAppendPrintf(e, "%-20s\t %4d\t ",	pool->label, pool->obj_size);    memPoolMeterReport(&pool->meter, pool->obj_size,	pool->meter.alloc.level, pool->meter.inuse.level, pool->meter.idle.level,	e);}voidmemReport(StoreEntry * e){    size_t overhd_size = 0;    int alloc_count = 0;    int inuse_count = 0;    int idle_count = 0;    int i;    /* caption */    storeAppendPrintf(e, "Current memory usage:\n");    /* heading */    storeAppendPrintf(e, "Pool\t Obj Size\t"	"Allocated\t\t\t\t\t In Use\t\t\t\t Idle\t\t\t Allocations Saved\t\t Hit Rate\t\n"	" \t (bytes)\t"	"(#)\t (KB)\t high (KB)\t high (hrs)\t impact (%%total)\t"	"(#)\t (KB)\t high (KB)\t portion (%%alloc)\t"	"(#)\t (KB)\t high (KB)\t"	"(%%number)\t (%%volume)\t"	"(%%number)"	"\n");    /* main table */    for (i = 0; i < Pools.count; i++) {	const MemPool *pool = Pools.items[i];	if (memPoolWasUsed(pool)) {	    memPoolReport(pool, e);	    alloc_count += pool->meter.alloc.level;	    inuse_count += pool->meter.inuse.level;	    idle_count += pool->meter.idle.level;	}	overhd_size += sizeof(MemPool) + sizeof(MemPool *) +	    strlen(pool->label) + 1 +	    pool->pstack.capacity * sizeof(void *);    }    overhd_size += sizeof(Pools) + Pools.capacity * sizeof(MemPool *);    /* totals */    storeAppendPrintf(e, "%-20s\t %-4s\t ", "Total", "-");    memPoolMeterReport(&TheMeter, 1, alloc_count, inuse_count, idle_count, e);    storeAppendPrintf(e, "Cumulative allocated volume: %s\n", gb_to_str(&mem_traffic_volume));    /* overhead */    storeAppendPrintf(e, "Current overhead: %d bytes (%.3f%%)\n",	overhd_size, xpercent(overhd_size, TheMeter.inuse.level));    /* limits */    storeAppendPrintf(e, "Idle pool limit: %.2f MB\n", toMB(mem_idle_limit));}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美日韩精品三区| 久久免费偷拍视频| 久久久久久久av麻豆果冻| 亚洲乱码中文字幕| 久久久不卡影院| 亚洲大尺度视频在线观看| 成人av资源网站| 久久久久久久精| 麻豆精品在线看| 91精品午夜视频| 亚洲第一狼人社区| 91福利视频久久久久| 亚洲天堂2014| 99久久99久久综合| 欧美一级一级性生活免费录像| 国产拍欧美日韩视频二区| 久久久99免费| 久久精品国产**网站演员| 国产精品综合一区二区| 日韩一级黄色片| 五月婷婷综合激情| 欧美美女bb生活片| 亚洲动漫第一页| 精品在线免费观看| 日韩精品一区二区三区蜜臀| 天天操天天干天天综合网| 欧美亚洲丝袜传媒另类| 一区二区三区资源| 久久99国产精品免费网站| 99久久精品99国产精品| 中文字幕欧美区| 成人精品在线视频观看| 国产精品网站在线观看| 成人国产在线观看| 欧美一级免费观看| 另类调教123区| 精品国产一区二区三区久久影院| 亚洲色图制服丝袜| 91麻豆蜜桃一区二区三区| 欧美电影免费提供在线观看| 久久电影网电视剧免费观看| 在线国产亚洲欧美| 亚洲一二三专区| 日韩欧美国产电影| 亚洲欧美区自拍先锋| 国产精品1区2区3区在线观看| 在线精品视频一区二区三四| 国产女同互慰高潮91漫画| 9i在线看片成人免费| 精品国产亚洲在线| 亚洲超碰精品一区二区| 日韩欧美综合一区| 成人在线视频一区二区| 一区二区三区不卡视频在线观看| 国产精品888| 一区二区三区电影在线播| 成人福利视频网站| 亚洲成人tv网| 久久精品视频在线免费观看 | 成人午夜私人影院| 亚洲欧美偷拍卡通变态| 欧美日韩国产美| 亚洲日韩欧美一区二区在线| 国产一区二区三区精品视频| 国产精品三级久久久久三级| 欧美日韩成人高清| 国产精品一区二区不卡| 欧美大片一区二区三区| 成人在线视频一区| 国产精品午夜久久| 欧美精品久久久久久久多人混战| 亚洲精品中文在线影院| 91精品国产综合久久福利软件 | 91免费看`日韩一区二区| 久久久久国产精品麻豆ai换脸| 人人狠狠综合久久亚洲| 国产欧美日韩三级| 欧美三区在线视频| 国产91精品一区二区| 五月天激情综合| 国产精品久久久久久久午夜片 | 在线日韩一区二区| 国内久久婷婷综合| 亚洲chinese男男1069| 国产日韩欧美精品综合| 51精品久久久久久久蜜臀| 成人高清免费观看| 午夜精品aaa| 久久嫩草精品久久久精品| 久久精品国产99| 天堂资源在线中文精品| 亚洲欧美中日韩| 91激情五月电影| 成人成人成人在线视频| 久久99精品一区二区三区三区| 精品国产91乱码一区二区三区 | 97aⅴ精品视频一二三区| 一区二区三区在线免费视频| 在线一区二区三区四区| 国产成人精品在线看| 久久99精品久久久| 日本网站在线观看一区二区三区 | 欧美日韩一区小说| 色综合夜色一区| 99这里只有精品| 国产高清无密码一区二区三区| 久久久久国产精品厨房| 日韩免费高清视频| 8x8x8国产精品| 欧美一卡二卡在线| 成人午夜视频网站| 亚洲成人免费视频| 亚洲午夜成aⅴ人片| 亚洲综合免费观看高清完整版| 欧美一三区三区四区免费在线看| 黄页网站大全一区二区| 久久精品噜噜噜成人av农村| 中文字幕在线视频一区| 国产欧美精品日韩区二区麻豆天美| 在线视频欧美精品| 欧美日韩在线三级| 欧美一区二视频| av高清不卡在线| 色综合激情五月| 欧美高清视频www夜色资源网| 国产成人av自拍| 91在线观看免费视频| 91成人国产精品| 国产精品中文字幕一区二区三区| 亚洲丝袜精品丝袜在线| 亚洲综合色网站| 蜜桃av噜噜一区| 成人精品国产免费网站| 色先锋资源久久综合| 欧美军同video69gay| 精品国产污污免费网站入口| 欧美国产精品一区| 亚洲精品国产品国语在线app| 久久久精品综合| 国产精品卡一卡二| 亚洲国产精品久久不卡毛片| 精品一区二区av| 色综合视频在线观看| 91精品国产色综合久久不卡电影| 色综合激情久久| 日韩一区二区在线播放| 国产精品丝袜一区| 日韩国产欧美一区二区三区| 粉嫩在线一区二区三区视频| 国产综合色产在线精品| 午夜电影网一区| 国产丶欧美丶日本不卡视频| 日本精品免费观看高清观看| 91色在线porny| 日韩欧美一级在线播放| 91精品国产乱码久久蜜臀| 日韩一区欧美小说| 精品一区二区在线免费观看| 色香蕉成人二区免费| 久久久精品国产99久久精品芒果| 欧美变态口味重另类| 亚洲一区在线观看免费| 国产999精品久久久久久绿帽| 国产主播一区二区| 欧美日本一区二区| 国产精品乱人伦中文| 精品亚洲国产成人av制服丝袜| 久久99久久精品| 欧美日韩综合不卡| 国产精品国模大尺度视频| 麻豆高清免费国产一区| 欧美性极品少妇| 亚洲视频 欧洲视频| 国产成人综合亚洲91猫咪| 日韩一区二区三区视频在线| 亚洲男人的天堂一区二区| 国产91高潮流白浆在线麻豆| 日韩一区二区在线看| 亚洲午夜久久久久久久久电影网 | 亚洲欧洲精品一区二区三区不卡| 国产精品护士白丝一区av| 亚洲视频在线观看一区| 成人亚洲一区二区一| 在线视频一区二区三| 成人欧美一区二区三区在线播放| 一区二区三区久久| 九九视频精品免费| 日韩精品一区二区三区在线播放| 国产欧美一区二区精品婷婷 | 欧美系列亚洲系列| 亚洲精品欧美激情| 日本久久一区二区三区| 最新中文字幕一区二区三区| 不卡av在线免费观看| 国产精品久久久久9999吃药| 国产 欧美在线| 国产精品午夜在线| 99在线精品一区二区三区| 亚洲人成网站在线| 极品尤物av久久免费看|