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

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

?? gc-incremental.c

?? java virtual machince kaffe
?? C
?? 第 1 頁 / 共 3 頁
字號:
/* gc-incremental.c * The garbage collector. * The name is misleading.  GC is non-incremental at this point. * * Copyright (c) 1996, 1997 *	Transvirtual Technologies, Inc.  All rights reserved. * * Copyright (c) 2003, 2004 *	Kaffe.org contributors. See ChangeLog for details. All rights reserved. *    * See the file "license.terms" for information on usage and redistribution  * of this file.  *//* XXX this should be controllable, somehow. */#define	SUPPORT_VERBOSEMEM#include "config.h"#include "debug.h"#include "config-std.h"#include "config-mem.h"#include "defs.h"#include "gtypes.h"#include "gc.h"#include "gc-mem.h"#include "locks.h"#include "thread.h"#include "jthread.h"#include "errors.h"#include "md.h"#include "stats.h"#include "classMethod.h"#include "gc-incremental.h"#include "gc-refs.h"#include "jvmpi_kaffe.h"#if defined(HAVE_SYS_TYPES_H)#include <sys/types.h>#endif /* defined(HAVE_SYS_TYPES_H) */static struct _gcStats {        uint32  totalmem;        uint32  totalobj;        uint32  freedmem;        uint32  freedobj;        uint32  markedobj;        uint32  markedmem;        uint32  allocobj;        uint32  allocmem;        uint32  finalobj;        uint32  finalmem;} gcStats;/* Avoid recursively allocating OutOfMemoryError */#define OOM_ALLOCATING		((void *) -1)#define STACK_SWEEP_MARGIN      1024#define GCSTACKSIZE		16384#define FINALIZERSTACKSIZE	THREADSTACKSIZE/* * Object implementing the collector interface. */static struct CollectorImpl {	Collector 	collector;	/* XXX include static below here for encapsulation */} gc_obj;/* XXX don't use these types ! */static Hjava_lang_Thread* garbageman;static Hjava_lang_Thread* finalman;static gcList gclists[6];static const int nofin_white = 5;static const int fin_white = 4;static const int grey = 3;static const int nofin_black = 2;static const int fin_black = 1;static const int finalise = 0;static int gc_init = 0;static volatile int gcDisabled = 0;static volatile int gcRunning = -1;static volatile bool finalRunning = false;static volatile bool finaliserStarted = false;#if defined(KAFFE_STATS)static timespent gc_time;static timespent sweep_time;static counter gcgcablemem;static counter gcfixedmem;#endif /* KAFFE_STATS *//* Is this pointer within our managed heap? */#define IS_A_HEAP_POINTER(from) \        ((uintp) (from) >= gc_get_heap_base() && \	 (uintp) (from) < gc_get_heap_base() + gc_get_heap_range())static void *outOfMem;static void *outOfMem_allocator;#if defined(SUPPORT_VERBOSEMEM)static struct {  ssize_t size;  int count;  uint64 total;} objectSizes[] = {#define OBJECTSIZE(SZ)  { SZ, 0, 0 },  /* The smaller sizes should match what's in the     freelist[] array defined in gc-mem.c */  OBJECTSIZE(16)  OBJECTSIZE(24)  OBJECTSIZE(32)  OBJECTSIZE(40)  OBJECTSIZE(48)  OBJECTSIZE(56)  OBJECTSIZE(64)  OBJECTSIZE(80)  OBJECTSIZE(96)  OBJECTSIZE(112)  OBJECTSIZE(128)  OBJECTSIZE(160)  OBJECTSIZE(192)  OBJECTSIZE(224)  OBJECTSIZE(240)  OBJECTSIZE(496)  OBJECTSIZE(1000)  OBJECTSIZE(2016)  OBJECTSIZE(4040)  OBJECTSIZE(8192)  OBJECTSIZE(12288)  OBJECTSIZE(16483)  OBJECTSIZE(32768)  OBJECTSIZE(65536)  OBJECTSIZE(131072)  OBJECTSIZE(262144)  OBJECTSIZE(524288)  OBJECTSIZE(1048576)  OBJECTSIZE(0x7FFFFFFF)#undef  OBJECTSIZE  { -1, -1, 0 }};static void objectStatsChange(gc_unit*, int);static void objectStatsPrint(void);static void objectSizesAdd(size_t);static void objectSizesPrint(void);#define	OBJECTSTATSADD(M)	objectStatsChange(M, 1)#define	OBJECTSTATSREMOVE(M)	objectStatsChange(M, -1)#define	OBJECTSTATSPRINT()	objectStatsPrint()#define	OBJECTSIZESADD(S)	objectSizesAdd(S)#else#define	OBJECTSTATSADD(M)#define	OBJECTSTATSREMOVE(M)#define	OBJECTSTATSPRINT()#define	OBJECTSIZESADD(S)#endif/* For statistics gathering, record how many objects and how  * much memory was marked. */static inlinevoid record_marked(int nr_of_objects, uint32 size){               gcStats.markedobj += nr_of_objects;        gcStats.markedmem += size;} static iStaticLock	gcman; static iStaticLock	finman;static iStaticLock	gcmanend;static iStaticLock	finmanend;static iStaticLock	gc_lock;	/* allocator mutex */static void gcFree(Collector* gcif, void* mem);/* Standard GC function sets.  We call them "allocation types" now */static gcFuncs gcFunctions[KGC_ALLOC_MAX_INDEX];/* * register an allocation type under a certain index * NB: we could instead return a pointer to the record describing the * allocation type.  This would give us more flexibility, but it wouldn't * allow us to use compile-time constants. */static voidregisterTypeByIndex(gc_alloc_type_t idx, walk_func_t walk, final_func_t final,	destroy_func_t destroy,	const char *description){	/* once only, please */	assert (gcFunctions[idx].description == 0);	/* don't exceed bounds */	assert (idx < sizeof(gcFunctions)/sizeof(gcFunctions[0]));	gcFunctions[idx].walk = walk;	gcFunctions[idx].final = final;	gcFunctions[idx].destroy = destroy;	gcFunctions[idx].description = description;}/* * Register a fixed allocation type.  The only reason we tell them apart * is for statistical purposes. */static voidgcRegisterFixedTypeByIndex(Collector* gcif UNUSED, 	gc_alloc_type_t idx, const char *description){	registerTypeByIndex(idx, NULL, KGC_OBJECT_FIXED, NULL, description);}/* * Register a allocation type that is subject to gc.   */static voidgcRegisterGcTypeByIndex(Collector* gcif UNUSED,	gc_alloc_type_t idx, walk_func_t walk, final_func_t final,	destroy_func_t destroy,	const char *description){	registerTypeByIndex(idx, walk, final, destroy, description);}static void startGC(Collector *gcif);static void finishGC(Collector *gcif);static void startFinalizer(void);static void markObjectDontCheck(gc_unit *unit, gc_block *info, uintp idx);/* Return true if gc_unit is pointer to an allocated object */static inline intgc_heap_isobject(gc_block *info, gc_unit *unit){	uintp p = (uintp) UTOMEM(unit) - gc_get_heap_base();	if (!(p & (MEMALIGN - 1)) && p < gc_get_heap_range() && GCBLOCKINUSE(info)) {		/* Make sure 'unit' refers to the beginning of an		 * object.  We do this by making sure it is correctly		 * aligned within the block.		 */		uint16 idx = GCMEM2IDX(info, unit);		if (idx < info->nr &&		    GCBLOCK2MEM(info, idx) == unit &&		    ((KGC_GET_COLOUR(info, idx) & KGC_COLOUR_INUSE) == KGC_COLOUR_INUSE || KGC_GET_COLOUR(info, idx) == KGC_COLOUR_FIXED)) {			return 1;		}	}	return 0;}static voidmarkObjectDontCheck(gc_unit *unit, gc_block *info, uintp idx){	/* If the object has been traced before, don't do it again. */	if (KGC_GET_COLOUR(info, idx) != KGC_COLOUR_WHITE) {		return;	}DBG(GCWALK,		dprintf("  marking @%p: %s\n", UTOMEM(unit),			describeObject(UTOMEM(unit)));    );	DBG(GCSTAT,	    switch (KGC_GET_FUNCS(info, idx)) {	    case KGC_ALLOC_NORMALOBJECT:	    case KGC_ALLOC_FINALIZEOBJECT:	    case KGC_ALLOC_PRIMARRAY:	    case KGC_ALLOC_REFARRAY: {		    Hjava_lang_Object *obj;		    obj = (Hjava_lang_Object *)(unit+1);		    if (obj->vtable != NULL) {			    Hjava_lang_Class *c;			    c = OBJECT_CLASS(obj);			    if (c)				    c->live_count++;		    }	    default: {	    }	    }});	    	/* If we found a new white object, mark it as grey and	 * move it into the grey list.	 */	KGC_SET_COLOUR(info, idx, KGC_COLOUR_GREY);	UREMOVELIST(unit);	UAPPENDLIST(gclists[grey], unit);}/* * Mark the memory given by an address if it really is an object. */static voidgcMarkAddress(Collector* gcif UNUSED, void *gc_info UNUSED, const void* mem){	gc_block* info;	gc_unit* unit;	/*	 * First we check to see if the memory 'mem' is in fact the	 * beginning of an object.  If not we just return.	 */	/* Get block info for this memory - if it exists */	info = gc_mem2block(mem);	unit = UTOUNIT(mem);	if (gc_heap_isobject(info, unit)) {		markObjectDontCheck(unit, info, GCMEM2IDX(info, unit));	}}/* * Mark an object.  Argument is assumed to point to a valid object, * and never, ever, be null. */static voidgcMarkObject(Collector* gcif UNUSED, void *gc_info UNUSED, const void* objp){  gc_unit *unit = UTOUNIT(objp);  gc_block *info = gc_mem2block(unit);  DBG(GCDIAG, assert(gc_heap_isobject(info, unit)));  markObjectDontCheck(unit, info, GCMEM2IDX(info, unit));}voidKaffeGC_WalkConservative(Collector* gcif, const void* base, uint32 size){	const int8* mem;DBG(GCWALK,		dprintf("scanning %d bytes conservatively from %p-%p\n", 		size, base, ((const char *)base) + size);    );	record_marked(1, size);	if (size > 0) {		uintp alignment = ALIGNMENTOF_VOIDP_IN_STACK;		for (mem = ((const int8*)base) + (size & -alignment) - sizeof(void*);		     (const void*)mem >= base;		     mem -= ALIGNMENTOF_VOIDP) {			const void *p = *(void * const *)mem;			if (p) {				gcMarkAddress(gcif, NULL, p);			}		}	}}/* * Like walkConservative, except that length is computed from the block size * of the object.  Must be called with pointer to object allocated by gc. */staticuint32gcGetObjectSize(Collector* gcif UNUSED, const void* mem){	return (GCBLOCKSIZE(gc_mem2block(UTOUNIT(mem))));}staticgc_alloc_type_tgcGetObjectIndex(Collector* gcif UNUSED, const void* mem){	gc_unit* unit = UTOUNIT(mem);	gc_block* info = gc_mem2block(unit);	if (!gc_heap_isobject(info, unit)) {		return (-1);	} else {		return (KGC_GET_FUNCS(info, GCMEM2IDX(info, unit)));	}}/* * Given a pointer within an object, find the base of the object. * This works for both gcable and fixed object types. * * This method uses many details of the allocator implementation. * Specifically, it relies on the contiguous layout of block infos * and the way gc_mem2block and GCMEM2IDX are implemented. */staticvoid*gcGetObjectBase(Collector *gcif UNUSED, void* mem){	int idx;	gc_block* info;	/* quickly reject pointers that are not part of this heap */	if (!IS_A_HEAP_POINTER(mem)) {		return (NULL);	}	lockStaticMutex(&gc_lock);	/* the allocator initializes all block infos of a large	   object using the address of the first page allocated	   for the large object. Hence, simply using GCMEM2* works	   even for large blocks	  */	info = gc_mem2block(mem);	idx = GCMEM2IDX(info, mem);	/* report fixed objects as well */	if (idx < info->nr && 	    ((KGC_GET_COLOUR(info, idx) & KGC_COLOUR_INUSE) || 	     (KGC_GET_COLOUR(info, idx) & KGC_COLOUR_FIXED))) 	{	    	mem = UTOMEM(GCBLOCK2MEM(info, idx));		unlockStaticMutex(&gc_lock);		return mem;	}	unlockStaticMutex(&gc_lock);	return (NULL);}staticconst char*gcGetObjectDescription(Collector* gcif, const void* mem){	return (gcFunctions[gcGetObjectIndex(gcif, mem)].description);}/* * Walk a bit of memory. */voidKaffeGC_WalkMemory(Collector* gcif, void* mem){	gc_block* info;	int idx;	gc_unit* unit;	uint32 size;	walk_func_t walkf;	unit = UTOUNIT(mem);	info = gc_mem2block(unit);	idx = GCMEM2IDX(info, unit);	if (KGC_GET_COLOUR(info, idx) == KGC_COLOUR_BLACK) {		return;	}	UREMOVELIST(unit);	/* if the object is about to be finalized, put it directly	 * into the finalise list, otherwise put it into the black	 * list.	 */	if (KGC_GET_STATE(info, idx) == KGC_STATE_INFINALIZE) {		gcStats.finalobj += 1;		gcStats.finalmem += GCBLOCKSIZE(info);		UAPPENDLIST(gclists[finalise], unit);	} else if (KGC_GET_STATE(info, idx) == KGC_STATE_NEEDFINALIZE) {		UAPPENDLIST(gclists[fin_black], unit);	} else {		UAPPENDLIST(gclists[nofin_black], unit);	}		KGC_SET_COLOUR(info, idx, KGC_COLOUR_BLACK);	assert(KGC_GET_FUNCS(info, idx) < 		sizeof(gcFunctions)/sizeof(gcFunctions[0]));	size = GCBLOCKSIZE(info);	record_marked(1, size);	walkf = gcFunctions[KGC_GET_FUNCS(info, idx)].walk;	if (walkf != NULL) {DBG(GCWALK,			dprintf("walking %d bytes @%p: %s\n", size, mem, 			describeObject(mem));    );		walkf(gcif, NULL, mem, size);	}}#if !(defined(NDEBUG) || !defined(KAFFE_VMDEBUG))static intgcClearCounts(Hjava_lang_Class *c, void *_ UNUSED){	c->live_count = 0;	return 0;}static intgcDumpCounts(Hjava_lang_Class *c, void *_ UNUSED){	if (c->live_count)		dprintf("%7d %s\n", c->live_count,	c->name->data);	return 0;}#endif /* !(defined(NDEBUG) || !defined(KAFFE_VMDEBUG)) *//* * The Garbage Collector sits in a loop starting a collection, waiting * until it's finished incrementally, then tidying up before starting * another one. */static void NONRETURNINGgcMan(void* arg){	gc_unit* unit;	gc_block* info;	uintp idx;	Collector *gcif = (Collector*)arg;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美日韩在线三级| 亚洲男人电影天堂| 日韩欧美一级二级| 这里只有精品电影| 欧美日韩国产首页| 欧美日韩情趣电影| 欧美高清视频www夜色资源网| 欧美天堂一区二区三区| 欧美探花视频资源| 欧美人体做爰大胆视频| 欧美高清视频一二三区| 欧美一区二区三区免费| 欧美本精品男人aⅴ天堂| 精品国产亚洲在线| 国产日韩精品一区二区三区| 国产精品视频九色porn| 综合中文字幕亚洲| 亚洲国产日韩在线一区模特| 亚洲va国产va欧美va观看| 人人爽香蕉精品| 国产中文字幕精品| 成人做爰69片免费看网站| 波多野结衣91| 欧美日韩日本视频| 精品国产1区2区3区| 国产亚洲制服色| 综合婷婷亚洲小说| 午夜精品国产更新| 精品亚洲国内自在自线福利| 高清久久久久久| 在线观看日韩高清av| 欧美片网站yy| 国产偷v国产偷v亚洲高清| 亚洲日本一区二区三区| 日韩在线观看一区二区| 国产一区二区在线视频| 91论坛在线播放| 欧美一卡二卡在线| 中文字幕一区二区在线播放| 亚洲一区二区3| 韩国欧美国产一区| 色婷婷久久综合| 日韩免费视频一区| 亚洲欧洲韩国日本视频| 日韩电影在线看| 成人免费av网站| 777亚洲妇女| 国产精品美女久久久久aⅴ国产馆| 亚洲一区二区三区激情| 国产精品主播直播| 欧美三级日韩三级| 国产日韩精品一区二区三区| 亚洲chinese男男1069| 国产91在线观看丝袜| 欧美欧美欧美欧美首页| 国产精品进线69影院| 日韩国产欧美在线视频| 99re8在线精品视频免费播放| 日韩欧美精品三级| 一级特黄大欧美久久久| 国产成人精品aa毛片| 制服丝袜日韩国产| 亚洲激情校园春色| 国产成人免费视频网站| 日韩一区二区在线播放| 亚洲欧美成aⅴ人在线观看| 韩国女主播成人在线观看| 欧美日韩中文一区| 亚洲同性gay激情无套| 国产一区91精品张津瑜| 欧美一区二区网站| 亚洲综合一区在线| av不卡免费在线观看| 精品国产三级电影在线观看| 偷拍日韩校园综合在线| 91热门视频在线观看| 国产精品网友自拍| 国产一区二区美女诱惑| 日韩亚洲欧美在线观看| 亚洲国产一二三| 97超碰欧美中文字幕| 亚洲国产成人自拍| 国产一区二区调教| 欧美不卡在线视频| 免费成人在线影院| 91麻豆精品国产| 亚洲不卡在线观看| 欧美视频完全免费看| 亚洲蜜臀av乱码久久精品蜜桃| 成人自拍视频在线| 欧美激情一区在线| 国产999精品久久| 国产日韩欧美一区二区三区综合| 久久66热re国产| 欧美成人乱码一区二区三区| 亚洲不卡av一区二区三区| 欧美在线观看视频一区二区三区| 中文字幕一区二区三区精华液| 风间由美一区二区av101| 国产日产欧产精品推荐色| 精品无人码麻豆乱码1区2区| 日韩免费看网站| 麻豆久久一区二区| 日韩欧美一区电影| 麻豆91免费看| 精品福利一区二区三区| 韩国视频一区二区| 久久理论电影网| 国产传媒久久文化传媒| 中文字幕高清不卡| 99久久精品免费看国产免费软件| 国产精品国产三级国产aⅴ入口| 不卡视频在线看| 中文字幕在线不卡视频| 色天使色偷偷av一区二区 | 亚洲乱码国产乱码精品精小说 | 亚洲网友自拍偷拍| 欧美视频自拍偷拍| 日韩av电影免费观看高清完整版 | 国产偷国产偷精品高清尤物| 国产**成人网毛片九色| 国产精品女同一区二区三区| 99久久精品情趣| 亚洲国产成人av好男人在线观看| 欧美乱妇一区二区三区不卡视频| 青青草成人在线观看| 亚洲精品在线免费观看视频| 国产成人鲁色资源国产91色综| 国产精品色在线| 在线视频亚洲一区| 轻轻草成人在线| 久久久国际精品| 91免费看视频| 亚洲成av人片在线| 精品国产伦理网| 99视频有精品| 日韩精品成人一区二区三区| 久久嫩草精品久久久久| 成人高清视频免费观看| 亚洲一区二区三区自拍| 精品美女被调教视频大全网站| 国产成人在线影院| 亚洲最大成人综合| 日韩三级伦理片妻子的秘密按摩| 高清不卡在线观看av| 亚洲午夜免费福利视频| 337p日本欧洲亚洲大胆精品| 91免费视频大全| 九九视频精品免费| 亚洲欧美日韩在线不卡| 日韩精品最新网址| 91丨九色丨国产丨porny| 蜜臀av一区二区| 日韩一区有码在线| 精品久久免费看| 在线国产亚洲欧美| 国产传媒日韩欧美成人| 午夜精品一区二区三区电影天堂 | 99精品国产91久久久久久| 丝袜美腿成人在线| 国产精品乱码人人做人人爱| 欧美丰满美乳xxx高潮www| 成人高清av在线| 日本不卡视频一二三区| 综合久久久久综合| 久久影院电视剧免费观看| 欧美性色黄大片| 成人福利视频网站| 免费成人在线影院| 亚洲成人激情综合网| 国产精品免费看片| 26uuu亚洲| 91精品国产91久久综合桃花| 91视视频在线观看入口直接观看www| 免费观看成人鲁鲁鲁鲁鲁视频| 日韩伦理免费电影| 久久久精品国产99久久精品芒果| 欧美日本在线观看| 色av一区二区| 成年人国产精品| 国产精品亚洲一区二区三区在线| 日本aⅴ亚洲精品中文乱码| 樱桃视频在线观看一区| 国产精品全国免费观看高清| 精品剧情在线观看| 在线不卡中文字幕| 欧美日韩在线综合| 日本韩国一区二区三区| av在线不卡网| 福利视频网站一区二区三区| 国产麻豆视频精品| 麻豆精品一区二区综合av| 午夜精品久久久久久久99水蜜桃 | 成人动漫视频在线| 国模少妇一区二区三区| 青草国产精品久久久久久| 亚洲高清免费观看高清完整版在线观看| 自拍偷自拍亚洲精品播放| 中文字幕乱码日本亚洲一区二区| 精品国产免费一区二区三区香蕉|