--- parser3/src/classes/memory.C 2003/09/22 14:56:13 1.3 +++ parser3/src/classes/memory.C 2023/09/26 20:49:06 1.20 @@ -1,15 +1,16 @@ /** @file Parser: @b memory parser class. - Copyright(c) 2001-2003 ArtLebedev Group(http://www.artlebedev.com) - Author: Alexandr Petrosian (http://paf.design.ru) + Copyright (c) 2001-2023 Art. Lebedev Studio (http://www.artlebedev.com) + Authors: Konstantin Morshnev , Alexandr Petrosian */ -static const char* IDENT_MATH_C="$Date: 2003/09/22 14:56:13 $"; - #include "pa_common.h" #include "pa_vmemory.h" #include "pa_request.h" +#include "pa_vmethod_frame.h" + +volatile const char * IDENT_MEMORY_C="$Id: memory.C,v 1.20 2023/09/26 20:49:06 moko Exp $" IDENT_PA_VMEMORY_H; class MMemory: public Methoded { public: @@ -21,32 +22,25 @@ public: // Methoded // global variables -DECLARE_CLASS_VAR(memory, 0 /*fictive*/, new MMemory); - -#ifdef GC_DEBUG -extern "C" GC_API void GC_print_backtrace(void *); -void *debug_print_backtrace=0; -#endif +DECLARE_CLASS_VAR(memory, new MMemory); -static void _compact(Request& r, MethodParams& params) { +static void _compact(Request& r, MethodParams&) { r.wipe_unused_execution_stack(); -#ifndef PA_DEBUG_DISABLE_GC - { - int saved=GC_dont_gc; - GC_dont_gc=0; - GC_gcollect(); - GC_dont_gc=saved; - } -#ifdef GC_DEBUG - if(debug_print_backtrace) - GC_print_backtrace(debug_print_backtrace); -#endif -#endif - } + pa_gc_collect(true); +} + +static void _auto_compact(Request& r, MethodParams& params) { + int divisor = params.as_int(0, "frequency must be int", r); + if(divisor<0 || divisor>5) + throw Exception(PARSER_RUNTIME, 0, "frequency '%d' is out of range 0..5", divisor); + pa_gc_set_free_space_divisor(divisor); +} // constructor MMemory::MMemory(): Methoded("memory") { // ^compact[] add_native_method("compact", Method::CT_STATIC, _compact, 0, 0); + // ^auto-compact(N) + add_native_method("auto-compact", Method::CT_STATIC, _auto_compact, 1, 1); }