mirror of https://github.com/arendst/Tasmota.git
Berry add gc objects metrics
This commit is contained in:
parent
97ba91ca58
commit
cad8c179b5
|
@ -169,6 +169,7 @@ static int m_counters(bvm *vm)
|
||||||
map_insert(vm, "set", vm->counter_set);
|
map_insert(vm, "set", vm->counter_set);
|
||||||
map_insert(vm, "try", vm->counter_try);
|
map_insert(vm, "try", vm->counter_try);
|
||||||
map_insert(vm, "raise", vm->counter_exc);
|
map_insert(vm, "raise", vm->counter_exc);
|
||||||
|
map_insert(vm, "objects", vm->counter_gc_scanned);
|
||||||
be_pop(vm, 1);
|
be_pop(vm, 1);
|
||||||
be_return(vm);
|
be_return(vm);
|
||||||
}
|
}
|
||||||
|
|
|
@ -497,6 +497,9 @@ static void delete_white(bvm *vm)
|
||||||
prev->next = next;
|
prev->next = next;
|
||||||
}
|
}
|
||||||
free_object(vm, node);
|
free_object(vm, node);
|
||||||
|
#if BE_USE_PERF_COUNTERS
|
||||||
|
vm->counter_gc_freed++;
|
||||||
|
#endif
|
||||||
} else {
|
} else {
|
||||||
gc_setwhite(node);
|
gc_setwhite(node);
|
||||||
prev = node;
|
prev = node;
|
||||||
|
@ -537,6 +540,10 @@ void be_gc_collect(bvm *vm)
|
||||||
if (vm->gc.status & GC_HALT) {
|
if (vm->gc.status & GC_HALT) {
|
||||||
return; /* the GC cannot run for some reason */
|
return; /* the GC cannot run for some reason */
|
||||||
}
|
}
|
||||||
|
#if BE_USE_PERF_COUNTERS
|
||||||
|
vm->counter_gc_scanned = 0;
|
||||||
|
vm->counter_gc_freed = 0;
|
||||||
|
#endif
|
||||||
#if BE_USE_OBSERVABILITY_HOOK
|
#if BE_USE_OBSERVABILITY_HOOK
|
||||||
if (vm->obshook != NULL)
|
if (vm->obshook != NULL)
|
||||||
(*vm->obshook)(vm, BE_OBS_GC_START, vm->gc.usage);
|
(*vm->obshook)(vm, BE_OBS_GC_START, vm->gc.usage);
|
||||||
|
@ -559,6 +566,6 @@ void be_gc_collect(bvm *vm)
|
||||||
vm->gc.threshold = next_threshold(vm->gc);
|
vm->gc.threshold = next_threshold(vm->gc);
|
||||||
#if BE_USE_OBSERVABILITY_HOOK
|
#if BE_USE_OBSERVABILITY_HOOK
|
||||||
if (vm->obshook != NULL)
|
if (vm->obshook != NULL)
|
||||||
(*vm->obshook)(vm, BE_OBS_GC_END, vm->gc.usage);
|
(*vm->obshook)(vm, BE_OBS_GC_END, vm->gc.usage, vm->counter_gc_scanned, vm->counter_gc_freed);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
|
@ -37,7 +37,11 @@ if (!gc_isconst(o)) { \
|
||||||
|
|
||||||
#define gc_setwhite(o) gc_setmark((o), GC_WHITE)
|
#define gc_setwhite(o) gc_setmark((o), GC_WHITE)
|
||||||
#define gc_setgray(o) gc_setmark((o), GC_GRAY)
|
#define gc_setgray(o) gc_setmark((o), GC_GRAY)
|
||||||
#define gc_setdark(o) gc_setmark((o), GC_DARK)
|
#if BE_USE_PERF_COUNTERS
|
||||||
|
#define gc_setdark(o) { vm->counter_gc_scanned++; gc_setmark((o), GC_DARK); }
|
||||||
|
#else
|
||||||
|
#define gc_setdark(o) gc_setmark((o), GC_DARK)
|
||||||
|
#endif
|
||||||
#define gc_isfixed(o) (((o)->marked & GC_FIXED) != 0)
|
#define gc_isfixed(o) (((o)->marked & GC_FIXED) != 0)
|
||||||
#define gc_setfixed(o) ((o)->marked |= GC_FIXED)
|
#define gc_setfixed(o) ((o)->marked |= GC_FIXED)
|
||||||
#define gc_clearfixed(o) ((o)->marked &= ~GC_FIXED)
|
#define gc_clearfixed(o) ((o)->marked &= ~GC_FIXED)
|
||||||
|
|
|
@ -472,6 +472,8 @@ BERRY_API bvm* be_vm_new(void)
|
||||||
vm->counter_set = 0;
|
vm->counter_set = 0;
|
||||||
vm->counter_try = 0;
|
vm->counter_try = 0;
|
||||||
vm->counter_exc = 0;
|
vm->counter_exc = 0;
|
||||||
|
vm->counter_gc_scanned = 0;
|
||||||
|
vm->counter_gc_freed = 0;
|
||||||
#endif
|
#endif
|
||||||
return vm;
|
return vm;
|
||||||
}
|
}
|
||||||
|
|
|
@ -112,6 +112,8 @@ struct bvm {
|
||||||
uint32_t counter_set; /* counter for SETMBR */
|
uint32_t counter_set; /* counter for SETMBR */
|
||||||
uint32_t counter_try; /* counter for `try` statement */
|
uint32_t counter_try; /* counter for `try` statement */
|
||||||
uint32_t counter_exc; /* counter for raised exceptions */
|
uint32_t counter_exc; /* counter for raised exceptions */
|
||||||
|
uint32_t counter_gc_scanned; /* counter for objects scanned by last gc */
|
||||||
|
uint32_t counter_gc_freed; /* counter for objects freed by last gc */
|
||||||
#endif
|
#endif
|
||||||
#if BE_USE_DEBUG_HOOK
|
#if BE_USE_DEBUG_HOOK
|
||||||
bvalue hook;
|
bvalue hook;
|
||||||
|
|
|
@ -262,7 +262,10 @@ void BerryObservability(bvm *vm, int event...) {
|
||||||
{
|
{
|
||||||
int32_t vm_usage2 = va_arg(param, int32_t);
|
int32_t vm_usage2 = va_arg(param, int32_t);
|
||||||
uint32_t gc_elapsed = millis() - gc_time;
|
uint32_t gc_elapsed = millis() - gc_time;
|
||||||
AddLog(LOG_LEVEL_DEBUG, PSTR(D_LOG_BERRY "GC from %i to %i bytes (in %d ms)"), vm_usage, vm_usage2, gc_elapsed);
|
uint32_t vm_scanned = va_arg(param, uint32_t);
|
||||||
|
uint32_t vm_freed = va_arg(param, uint32_t);
|
||||||
|
AddLog(LOG_LEVEL_DEBUG, D_LOG_BERRY "GC from %i to %i bytes, objects freed %i/%i (in %d ms)",
|
||||||
|
vm_usage, vm_usage2, vm_freed, vm_scanned, gc_elapsed);
|
||||||
// make new threshold tighter when we reach high memory usage
|
// make new threshold tighter when we reach high memory usage
|
||||||
if (!UsePSRAM() && vm->gc.threshold > 20*1024) {
|
if (!UsePSRAM() && vm->gc.threshold > 20*1024) {
|
||||||
vm->gc.threshold = vm->gc.usage + 10*1024; // increase by only 10 KB
|
vm->gc.threshold = vm->gc.usage + 10*1024; // increase by only 10 KB
|
||||||
|
|
Loading…
Reference in New Issue