mirror of
https://github.com/pocketpy/pocketpy
synced 2025-10-22 20:40:18 +00:00
allowing disable gc
This commit is contained in:
parent
6b0c96bb7c
commit
c329e09fac
@ -6,3 +6,15 @@ label: gc
|
|||||||
### `gc.collect()`
|
### `gc.collect()`
|
||||||
|
|
||||||
Invoke the garbage collector.
|
Invoke the garbage collector.
|
||||||
|
|
||||||
|
### `gc.enable()`
|
||||||
|
|
||||||
|
Enable automatic garbage collection.
|
||||||
|
|
||||||
|
### `gc.disable()`
|
||||||
|
|
||||||
|
Disable automatic garbage collection.
|
||||||
|
|
||||||
|
### `gc.isenabled()`
|
||||||
|
|
||||||
|
Return `True` if automatic garbage collection is enabled, `False` otherwise.
|
@ -25,14 +25,6 @@
|
|||||||
#define PK_FREE(ptr) free(ptr)
|
#define PK_FREE(ptr) free(ptr)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*************** debug settings ***************/
|
|
||||||
// Do not edit the following settings unless you know what you are doing
|
|
||||||
#define PK_DEBUG_CEVAL_STEP 0
|
|
||||||
#define PK_DEBUG_MEMORY_POOL 0
|
|
||||||
#define PK_DEBUG_NO_AUTO_GC 0
|
|
||||||
#define PK_DEBUG_GC_STATS 0
|
|
||||||
#define PK_DEBUG_COMPILER 0
|
|
||||||
|
|
||||||
/*************** internal settings ***************/
|
/*************** internal settings ***************/
|
||||||
|
|
||||||
// This is the maximum size of the value stack in py_TValue units
|
// This is the maximum size of the value stack in py_TValue units
|
||||||
|
@ -6,6 +6,8 @@ typedef struct ManagedHeap{
|
|||||||
|
|
||||||
int gc_threshold;
|
int gc_threshold;
|
||||||
int gc_counter;
|
int gc_counter;
|
||||||
|
bool gc_enabled;
|
||||||
|
|
||||||
VM* vm;
|
VM* vm;
|
||||||
|
|
||||||
void (*gc_on_delete)(VM*, PyObject*);
|
void (*gc_on_delete)(VM*, PyObject*);
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
static bool merge(char* a,
|
static bool _stable_sort_merge(char* a,
|
||||||
char* a_end,
|
char* a_end,
|
||||||
char* b,
|
char* b,
|
||||||
char* b_end,
|
char* b_end,
|
||||||
@ -44,7 +44,7 @@ bool c11__stable_sort(void* ptr_,
|
|||||||
for(char* a = ptr; a < ptr + (length - seg) * elem_size; a += 2 * seg * elem_size) {
|
for(char* a = ptr; a < ptr + (length - seg) * elem_size; a += 2 * seg * elem_size) {
|
||||||
char *b = a + seg * elem_size, *a_end = b, *b_end = b + seg * elem_size;
|
char *b = a + seg * elem_size, *a_end = b, *b_end = b + seg * elem_size;
|
||||||
if(b_end > ptr + length * elem_size) b_end = ptr + length * elem_size;
|
if(b_end > ptr + length * elem_size) b_end = ptr + length * elem_size;
|
||||||
bool ok = merge(a, a_end, b, b_end, tmp, elem_size, f_lt, extra);
|
bool ok = _stable_sort_merge(a, a_end, b, b_end, tmp, elem_size, f_lt, extra);
|
||||||
if(!ok) {
|
if(!ok) {
|
||||||
PK_FREE(tmp);
|
PK_FREE(tmp);
|
||||||
return false;
|
return false;
|
||||||
|
@ -8,6 +8,8 @@ void ManagedHeap__ctor(ManagedHeap* self, VM* vm) {
|
|||||||
|
|
||||||
self->gc_threshold = PK_GC_MIN_THRESHOLD;
|
self->gc_threshold = PK_GC_MIN_THRESHOLD;
|
||||||
self->gc_counter = 0;
|
self->gc_counter = 0;
|
||||||
|
self->gc_enabled = true;
|
||||||
|
|
||||||
self->vm = vm;
|
self->vm = vm;
|
||||||
|
|
||||||
self->gc_on_delete = NULL;
|
self->gc_on_delete = NULL;
|
||||||
@ -27,6 +29,7 @@ void ManagedHeap__dtor(ManagedHeap* self) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void ManagedHeap__collect_if_needed(ManagedHeap* self) {
|
void ManagedHeap__collect_if_needed(ManagedHeap* self) {
|
||||||
|
if(!self->gc_enabled) return;
|
||||||
if(self->gc_counter < self->gc_threshold) return;
|
if(self->gc_counter < self->gc_threshold) return;
|
||||||
self->gc_counter = 0;
|
self->gc_counter = 0;
|
||||||
ManagedHeap__collect(self);
|
ManagedHeap__collect(self);
|
||||||
|
@ -1,8 +1,4 @@
|
|||||||
#include "pocketpy/pocketpy.h"
|
#include "pocketpy/pocketpy.h"
|
||||||
|
|
||||||
#include "pocketpy/common/utils.h"
|
|
||||||
#include "pocketpy/objects/object.h"
|
|
||||||
#include "pocketpy/common/sstream.h"
|
|
||||||
#include "pocketpy/interpreter/vm.h"
|
#include "pocketpy/interpreter/vm.h"
|
||||||
|
|
||||||
static bool gc_collect(int argc, py_Ref argv){
|
static bool gc_collect(int argc, py_Ref argv){
|
||||||
@ -13,8 +9,34 @@ static bool gc_collect(int argc, py_Ref argv){
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool gc_enable(int argc, py_Ref argv){
|
||||||
|
PY_CHECK_ARGC(0);
|
||||||
|
ManagedHeap* heap = &pk_current_vm->heap;
|
||||||
|
heap->gc_enabled = true;
|
||||||
|
py_newnone(py_retval());
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool gc_disable(int argc, py_Ref argv){
|
||||||
|
PY_CHECK_ARGC(0);
|
||||||
|
ManagedHeap* heap = &pk_current_vm->heap;
|
||||||
|
heap->gc_enabled = false;
|
||||||
|
py_newnone(py_retval());
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool gc_isenabled(int argc, py_Ref argv){
|
||||||
|
PY_CHECK_ARGC(0);
|
||||||
|
ManagedHeap* heap = &pk_current_vm->heap;
|
||||||
|
py_newbool(py_retval(), heap->gc_enabled);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
void pk__add_module_gc() {
|
void pk__add_module_gc() {
|
||||||
py_Ref mod = py_newmodule("gc");
|
py_Ref mod = py_newmodule("gc");
|
||||||
|
|
||||||
py_bindfunc(mod, "collect", gc_collect);
|
py_bindfunc(mod, "collect", gc_collect);
|
||||||
|
py_bindfunc(mod, "enable", gc_enable);
|
||||||
|
py_bindfunc(mod, "disable", gc_disable);
|
||||||
|
py_bindfunc(mod, "isenabled", gc_isenabled);
|
||||||
}
|
}
|
Loading…
x
Reference in New Issue
Block a user