📄 ejsgc.c
字号:
/* * @file ejsGC.c * @brief Garbage collector class for the EJS Object Model *//********************************** Copyright *********************************//* * Copyright (c) Mbedthis Software LLC, 2005-2006. All Rights Reserved. *//********************************** Includes **********************************/#include "ejs.h"/******************************************************************************//************************************ Methods *********************************//******************************************************************************/#if (WIN || BREW_SIMULATOR) && BLD_DEBUGstatic int checkProc(Ejs *ep, EjsVar *thisObj, int argc, EjsVar **argv){ _CrtCheckMemory(); return 0;}#endif/******************************************************************************/static int debugProc(Ejs *ep, EjsVar *thisObj, int argc, EjsVar **argv){ if (argc != 1) { ejsError(ep, EJS_ARG_ERROR, "Bad args: debug(debugLevel)"); return -1; } ejsSetGCDebugLevel(ep, ejsVarToInteger(argv[0])); return 0;}/******************************************************************************//* * Print stats and dump objects */static int printStatsProc(Ejs *ep, EjsVar *thisObj, int argc, EjsVar **argv){ bool leakStats; if (argc > 1) { leakStats = ejsVarToInteger(argv[0]); } else { leakStats = 0; }#if BLD_FEATURE_ALLOC_STATS ejsPrintAllocReport(ep, 0); mprPrintAllocReport(mprGetApp(ep), leakStats, 0);#endif#if BLD_DEBUG ejsDumpObjects(ep);#endif return 0;}/******************************************************************************/static int runProc(Ejs *ep, EjsVar *thisObj, int argc, EjsVar **argv){ if (argc > 1) { ejsError(ep, EJS_ARG_ERROR, "Bad args: run([quick])"); return -1; } if (argc == 1) { ejsIncrementalCollectGarbage(ep); } else { ejsCollectGarbage(ep, -1); } return 0;}/******************************************************************************/static int usedMemoryProc(Ejs *ep, EjsVar *thisObj, int argc, EjsVar **argv){ ejsSetReturnValueToInteger(ep, ejsGetUsedMemory(ep)); return 0;}/******************************************************************************/static int allocatedMemoryProc(Ejs *ep, EjsVar *thisObj, int argc, EjsVar **argv){#if BLD_FEATURE_ALLOC_STATS ejsSetReturnValueToInteger(ep, ejsGetAllocatedMemory(ep));#endif return 0;}/******************************************************************************/static int mprMemoryProc(Ejs *ep, EjsVar *thisObj, int argc, EjsVar **argv){#if BLD_FEATURE_ALLOC_STATS ejsSetReturnValueToInteger(ep, mprGetAllocatedMemory(ep));#endif return 0;}/******************************************************************************/static int peakMprMemoryProc(Ejs *ep, EjsVar *thisObj, int argc, EjsVar **argv){#if BLD_FEATURE_ALLOC_STATS ejsSetReturnValueToInteger(ep, mprGetPeakAllocatedMemory(ep));#endif return 0;}/******************************************************************************/static int getDebugLevel(Ejs *ep, EjsVar *thisObj, int argc, EjsVar **argv){ ejsSetReturnValueToInteger(ep, ep->gc.debugLevel); return 0;}/******************************************************************************/static int setDebugLevel(Ejs *ep, EjsVar *thisObj, int argc, EjsVar **argv){ if (argc != 1) { ejsArgError(ep, "Bad arguments"); return -1; } ep->gc.debugLevel= ejsVarToInteger(argv[0]); return 0;}/******************************************************************************/static int getEnable(Ejs *ep, EjsVar *thisObj, int argc, EjsVar **argv){ ejsSetReturnValueToBoolean(ep, ep->gc.enable); return 0;}/******************************************************************************/static int setEnable(Ejs *ep, EjsVar *thisObj, int argc, EjsVar **argv){ if (argc != 1) { ejsArgError(ep, "Bad arguments"); return -1; } ep->gc.enable= ejsVarToBoolean(argv[0]); return 0;}/******************************************************************************/static int getDemandCollect(Ejs *ep, EjsVar *thisObj, int argc, EjsVar **argv){ ejsSetReturnValueToBoolean(ep, ep->gc.enableDemandCollect); return 0;}/******************************************************************************/static int setDemandCollect(Ejs *ep, EjsVar *thisObj, int argc, EjsVar **argv){ if (argc != 1) { ejsArgError(ep, "Bad arguments"); return -1; } ep->gc.enableDemandCollect = ejsVarToBoolean(argv[0]); return 0;}/******************************************************************************/static int getIdleCollect(Ejs *ep, EjsVar *thisObj, int argc, EjsVar **argv){ ejsSetReturnValueToBoolean(ep, ep->gc.enableIdleCollect); return 0;}/******************************************************************************/static int setIdleCollect(Ejs *ep, EjsVar *thisObj, int argc, EjsVar **argv){ if (argc != 1) { ejsArgError(ep, "Bad arguments"); return -1; } ep->gc.enableIdleCollect = ejsVarToBoolean(argv[0]); return 0;}/******************************************************************************/static int getWorkQuota(Ejs *ep, EjsVar *thisObj, int argc, EjsVar **argv){ ejsSetReturnValueToInteger(ep, ep->gc.workQuota); return 0;}/******************************************************************************/static int setWorkQuota(Ejs *ep, EjsVar *thisObj, int argc, EjsVar **argv){ int quota; if (argc != 1) { ejsArgError(ep, "Bad arguments"); return -1; } quota = ejsVarToInteger(argv[0]); if (quota < EJS_GC_MIN_WORK_QUOTA && quota != 0) { ejsArgError(ep, "Bad work quota"); return -1; } ep->gc.workQuota = quota; return 0;}/******************************************************************************/static int getMaxMemory(Ejs *ep, EjsVar *thisObj, int argc, EjsVar **argv){ ejsSetReturnValueToInteger(ep, ep->gc.maxMemory); return 0;}/******************************************************************************/static int setMaxMemory(Ejs *ep, EjsVar *thisObj, int argc, EjsVar **argv){ int maxMemory; if (argc != 1) { ejsArgError(ep, "Bad arguments"); return -1; } maxMemory = ejsVarToInteger(argv[0]); if (maxMemory < 0) { ejsArgError(ep, "Bad maxMemory"); return -1; } ep->gc.maxMemory = maxMemory; return 0;}/******************************************************************************//******************************** Initialization ******************************//******************************************************************************/int ejsDefineGCClass(Ejs *ep){ EjsVar *gcClass; int flags; flags = EJS_NO_LOCAL; /* * NOTE: We create the GC class and define static methods on it. There * is no object instance */ gcClass = ejsDefineClass(ep, "System.GC", "Object", 0); if (gcClass == 0) { return MPR_ERR_CANT_INITIALIZE; } /* * MOB -- convert these to properties with accessors when available */ ejsDefineCMethod(ep, gcClass, "printStats", printStatsProc, flags); ejsDefineCMethod(ep, gcClass, "run", runProc, flags); ejsDefineCMethod(ep, gcClass, "getUsedMemory", usedMemoryProc, flags); ejsDefineCMethod(ep, gcClass, "getAllocatedMemory", allocatedMemoryProc, flags); ejsDefineCMethod(ep, gcClass, "getMprMemory", mprMemoryProc, flags); ejsDefineCMethod(ep, gcClass, "getPeakMprMemory", peakMprMemoryProc, flags); ejsDefineCMethod(ep, gcClass, "debug", debugProc, flags);#if (WIN || BREW_SIMULATOR) && BLD_DEBUG ejsDefineCMethod(ep, gcClass, "check", checkProc, flags);#endif ejsDefineCAccessors(ep, gcClass, "debugLevel", getDebugLevel, setDebugLevel, flags); ejsDefineCAccessors(ep, gcClass, "enable", getEnable, setEnable, flags); ejsDefineCAccessors(ep, gcClass, "demandCollect", getDemandCollect, setDemandCollect, flags); ejsDefineCAccessors(ep, gcClass, "idleCollect", getIdleCollect, setIdleCollect, flags); ejsDefineCAccessors(ep, gcClass, "workQuota", getWorkQuota, setWorkQuota, flags); ejsDefineCAccessors(ep, gcClass, "maxMemory", getMaxMemory, setMaxMemory, flags); return ejsObjHasErrors(gcClass) ? MPR_ERR_CANT_INITIALIZE : 0;}/******************************************************************************//* * Local variables: * tab-width: 4 * c-basic-offset: 4 * End: * vim:tw=78 * vim600: sw=4 ts=4 fdm=marker * vim<600: sw=4 ts=4 */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -