diff options
author | Mike Pall <mike> | 2022-07-28 15:40:28 +0200 |
---|---|---|
committer | Mike Pall <mike> | 2022-07-28 15:40:28 +0200 |
commit | a7d0265480c662964988f83d4e245bf139eb7cc0 (patch) | |
tree | 0a7c33077b429e61bc86bd90936752710e0cccfa | |
parent | 9c3df68a1e00bd1fcaee13610fb063efe8ae3825 (diff) | |
download | luajit-a7d0265480c662964988f83d4e245bf139eb7cc0.tar.gz luajit-a7d0265480c662964988f83d4e245bf139eb7cc0.tar.bz2 luajit-a7d0265480c662964988f83d4e245bf139eb7cc0.zip |
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).
-rw-r--r-- | src/lj_gc.c | 3 |
1 files changed, 3 insertions, 0 deletions
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) | |||
700 | } | 700 | } |
701 | case GCSfinalize: | 701 | case GCSfinalize: |
702 | if (gcref(g->gc.mmudata) != NULL) { | 702 | if (gcref(g->gc.mmudata) != NULL) { |
703 | GCSize old = g->gc.total; | ||
703 | if (tvref(g->jit_base)) /* Don't call finalizers on trace. */ | 704 | if (tvref(g->jit_base)) /* Don't call finalizers on trace. */ |
704 | return LJ_MAX_MEM; | 705 | return LJ_MAX_MEM; |
705 | gc_finalize(L); /* Finalize one userdata object. */ | 706 | gc_finalize(L); /* Finalize one userdata object. */ |
707 | if (old >= g->gc.total && g->gc.estimate > old - g->gc.total) | ||
708 | g->gc.estimate -= old - g->gc.total; | ||
706 | if (g->gc.estimate > GCFINALIZECOST) | 709 | if (g->gc.estimate > GCFINALIZECOST) |
707 | g->gc.estimate -= GCFINALIZECOST; | 710 | g->gc.estimate -= GCFINALIZECOST; |
708 | return GCFINALIZECOST; | 711 | return GCFINALIZECOST; |