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

📄 gc.h

📁 基于LWVCL开发的库
💻 H
字号:
/* * gc.h * The garbage collector. * * Copyright (c) 1996, 1997 *	Transvirtual Technologies, Inc.  All rights reserved. * * See the file "license.terms" for information on usage and redistribution  * of this file.  */#ifndef __gc_h#define __gc_h#if defined(HAVE_CONFIG_H)#include "config.h"#endif#include "config-int.h"#if defined(HAVE_LIMITS_H)#include <limits.h>#endif#include "gtypes.h"/* * Default values for initial and maximum heap size and heap increment. */#define UNLIMITED_HEAP  (INT32_MAX)#define	MIN_HEAPSIZE	(5*1024*1024)#define	MAX_HEAPSIZE	(UNLIMITED_HEAP)#define	ALLOC_HEAPSIZE	(1024*1024)/* * This macro sets the maximal value you can allocate in one chunk of memory. The type * signed so we substract one bit. */#define KGC_MAX_MALLOC_TYPE SIZE_MAX/*  * We do not support incremental collection as this time. */#undef	KGC_INCREMENTALtypedef struct _Collector Collector;typedef void (*walk_func_t)(struct _Collector* collector, void* gc_info, void* obj, uint32 size);typedef void (*final_func_t)(struct _Collector* collector, void* obj);typedef void (*destroy_func_t)(struct _Collector* collector, void* obj);#define	KGC_OBJECT_NORMAL	  ((final_func_t)0)#define	KGC_OBJECT_FIXED	  ((final_func_t)1)/* * Garbage collector interface. */typedef enum {	/* allocation types for different kinds of java objects */	KGC_ALLOC_JAVASTRING,	KGC_ALLOC_NOWALK,	KGC_ALLOC_NORMALOBJECT,	KGC_ALLOC_PRIMARRAY,	KGC_ALLOC_REFARRAY,	KGC_ALLOC_FINALIZEOBJECT,	KGC_ALLOC_JAVALOADER,	KGC_ALLOC_VMWEAKREF,	/* allocation types related to the translator engines */	KGC_ALLOC_JITCODE,	KGC_ALLOC_JITTEMP,	KGC_ALLOC_JIT_SEQ,	KGC_ALLOC_JIT_CONST,	KGC_ALLOC_JIT_ARGS,	KGC_ALLOC_JIT_FAKE_CALL,	KGC_ALLOC_JIT_SLOTS,	KGC_ALLOC_JIT_CODEBLOCK,	KGC_ALLOC_JIT_LABELS,	KGC_ALLOC_TRAMPOLINE,		/* allocation types used for java.lang.Class and its parts */	KGC_ALLOC_CLASSOBJECT,	KGC_ALLOC_BYTECODE,	KGC_ALLOC_EXCEPTIONTABLE,	KGC_ALLOC_STATICDATA,	KGC_ALLOC_CONSTANT,	KGC_ALLOC_DISPATCHTABLE,	KGC_ALLOC_METHOD,	KGC_ALLOC_FIELD,	KGC_ALLOC_INTERFACE,	KGC_ALLOC_LINENRTABLE,	KGC_ALLOC_LOCALVARTABLE,	KGC_ALLOC_DECLAREDEXC,	KGC_ALLOC_INTERFACE_TABLE,	KGC_ALLOC_CLASSMISC,	/* miscelanious allocation types */	KGC_ALLOC_FIXED,	KGC_ALLOC_UTF8CONST,	KGC_ALLOC_LOCK,	KGC_ALLOC_THREADCTX,	KGC_ALLOC_STATIC_THREADDATA,	KGC_ALLOC_REF,	KGC_ALLOC_JAR,	KGC_ALLOC_CODEANALYSE,	KGC_ALLOC_CLASSPOOL,	KGC_ALLOC_VERIFIER,	KGC_ALLOC_NATIVELIB,	KGC_ALLOC_MAX_INDEX} gc_alloc_type_t;/* * Define a COM-like GC interface. */struct GarbageCollectorInterface_Ops;struct _Collector {	struct GarbageCollectorInterface_Ops *ops;};struct GarbageCollectorInterface_Ops {        const char * (*getCollectorName)(Collector *);	void*   reserved2;	void*   reserved3;	void*	(*malloc)(Collector *, size_t size, gc_alloc_type_t type);	void*	(*realloc)(Collector *, void* addr, size_t size, gc_alloc_type_t type);	void	(*free)(Collector *, void* addr);	void	(*invoke)(Collector *, int mustgc);	void	(*invokeFinalizer)(Collector *);	void	(*init)(Collector *);	void	(*enable)(Collector *);	void	(*markAddress)(Collector *, void *gc_info, const void* addr);	void	(*markObject)(Collector *, void *gc_info, const void* obj);	uint32	(*getObjectSize)(Collector *, const void* obj);	const char* (*getObjectDescription)(Collector *, const void* obj);	gc_alloc_type_t	(*getObjectIndex)(Collector *, const void* obj);	void*	(*getObjectBase)(Collector *, void* obj);	void	(*registerFixedTypeByIndex)(Collector *, 			gc_alloc_type_t gc_index, const char *description);	void 	(*registerGcTypeByIndex)(Collector *, 			gc_alloc_type_t gc_index,			walk_func_t walk, final_func_t final, 			destroy_func_t destroy, const char					 *description);	struct Hjava_lang_Throwable *(*throwOOM)(Collector *);	void 	(*enableGC)(Collector *);	void 	(*disableGC)(Collector *);        uintp   (*getHeapFree)(Collector *);         uintp   (*getHeapLimit)(Collector *);        uintp   (*getHeapTotal)(Collector *);        bool    (*addRef)(Collector *, const void *mem);        bool    (*rmRef)(Collector *, void *ref);        bool    (*addWeakRef)(Collector *, void *mem, void **ref);        bool    (*rmWeakRef)(Collector *, void *mem, void **ref);};Collector* createGC(void);/* * Convenience macros */#define KGC_malloc(G, size, type)	\    ((G)->ops->malloc)((Collector*)(G), (size), (type))#define KGC_realloc(G, addr, size, type)	\    ((G)->ops->realloc)((Collector*)(G), (addr), (size), (type))#define KGC_free(G, addr)		\    ((G)->ops->free)((Collector*)(G), (addr))#define KGC_invoke(G, mustgc)		\    ((G)->ops->invoke)((Collector*)(G), (mustgc))#define KGC_invokeFinalizer(G)		\    ((G)->ops->invokeFinalizer)((Collector*)(G))#define KGC_init(G)		\    ((G)->ops->init)((Collector*)(G))#define KGC_enable(G)		\    ((G)->ops->enable)((Collector*)(G))#define KGC_throwOOM(G)		\    ((G)->ops->throwOOM)((Collector*)(G))#define KGC_markAddress(G, gc_info, addr)		\    ((G)->ops->markAddress)((Collector*)(G), (gc_info), (addr))#define KGC_addRef(G, addr) \    ((G)->ops->addRef)((Collector*)(G), (addr))#define KGC_rmRef(G, addr) \    ((G)->ops->rmRef)((Collector*)(G), (addr))#define KGC_addWeakRef(G, addr, ref) \    ((G)->ops->addWeakRef((Collector *)(G), (addr), (ref)))#define KGC_rmWeakRef(G, addr, ref) \    ((G)->ops->rmWeakRef((Collector *)(G), (addr), (ref)))#if !defined(KAFFEH)static inline void KGC_markObject(void *g, void *gc_info, const void *addr){	if (addr)		((Collector*) g)->ops->markObject((Collector*) g, gc_info, addr);}#endif#define KGC_getObjectSize(G, obj)	\    ((G)->ops->getObjectSize)((Collector*)(G), (obj))#define KGC_getObjectDescription(G, obj)	\    ((G)->ops->getObjectDescription)((Collector*)(G), (obj))#define KGC_getObjectIndex(G, obj)	\    ((G)->ops->getObjectIndex)((Collector*)(G), (obj))#define KGC_getObjectBase(G, obj)	\    ((G)->ops->getObjectBase)((Collector*)(G), (obj))#define KGC_registerFixedTypeByIndex(G, idx, desc)	\    ((G)->ops->registerFixedTypeByIndex)((Collector*)(G),   \				(idx), (desc))#define KGC_registerGcTypeByIndex(G, idx, walk, final, destroy, desc)	\    ((G)->ops->registerGcTypeByIndex)((Collector*)(G), 	     \				(idx), (walk), (final), (destroy), (desc))#define KGC_enableGC(G)		\    ((G)->ops->enableGC)((Collector*)(G));#define KGC_disableGC(G)		\    ((G)->ops->disableGC)((Collector*)(G));#define KGC_getHeapFree(G) \    ((G)->ops->getHeapFree)((Collector *)(G));#define KGC_getHeapLimit(G) \    ((G)->ops->getHeapLimit)((Collector *)(G));#define KGC_getHeapTotal(G) \    ((G)->ops->getHeapTotal)((Collector *)(G));#define KGC_getCollectorName(G) \    ((G)->ops->getCollectorName)((Collector *)(G));#define KGC_WRITE(a, b)/* * Compatibility macros to access GC functions */extern Collector* main_collector;extern Collector* KGC_getMainCollector(void);#define	gc_malloc(A,B)	    KGC_malloc(KGC_getMainCollector(),A,B)#define	gc_calloc(A,B,C)    KGC_malloc(KGC_getMainCollector(),(A)*(B),C)#define	gc_realloc(A,B,C)   KGC_realloc(KGC_getMainCollector(),(A),(B),C)#define	gc_free(A)	    KGC_free(KGC_getMainCollector(),(A))#define gc_add_ref(A)       KGC_addRef(KGC_getMainCollector(), (A))#define gc_rm_ref(A)        KGC_rmRef(KGC_getMainCollector(), (A))#define	invokeGC()	    KGC_invoke(KGC_getMainCollector(),1)#define	adviseGC()	    KGC_invoke(KGC_getMainCollector(),0)#define	invokeFinalizer()   KGC_invokeFinalizer(KGC_getMainCollector())#define gc_throwOOM()	    KGC_throwOOM(KGC_getMainCollector())#define gc_enableGC()	    KGC_enableGC(KGC_getMainCollector())#define gc_disableGC()	    KGC_disableGC(KGC_getMainCollector())extern const char* describeObject(const void* mem);Collector* 		initCollector(void);#endif

⌨️ 快捷键说明

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