1
0
mirror of https://github.com/samba-team/samba.git synced 2025-12-17 04:23:50 +03:00
Files
samba-mirror/source/lib/appweb/ejs-2.0/ejs/system/ejsGC.c

327 lines
8.2 KiB
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_DEBUG
static 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
*/