From a7d0265480c662964988f83d4e245bf139eb7cc0 Mon Sep 17 00:00:00 2001 From: Mike Pall Date: Thu, 28 Jul 2022 15:40:28 +0200 Subject: Improve GC estimation for userdata with attached managed memory. This works well for string.buffers, but not for userdata or cdata with attached unmanaged memory (malloc/free, mmap/munmap). --- src/lj_gc.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/lj_gc.c b/src/lj_gc.c index b35a0d44..2fc52ec1 100644 --- a/src/lj_gc.c +++ b/src/lj_gc.c @@ -700,9 +700,12 @@ static size_t gc_onestep(lua_State *L) } case GCSfinalize: if (gcref(g->gc.mmudata) != NULL) { + GCSize old = g->gc.total; if (tvref(g->jit_base)) /* Don't call finalizers on trace. */ return LJ_MAX_MEM; gc_finalize(L); /* Finalize one userdata object. */ + if (old >= g->gc.total && g->gc.estimate > old - g->gc.total) + g->gc.estimate -= old - g->gc.total; if (g->gc.estimate > GCFINALIZECOST) g->gc.estimate -= GCFINALIZECOST; return GCFINALIZECOST; -- cgit v1.2.1