浏览代码

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).
Mike Pall 3 年之前
父节点
当前提交
a7d0265480
共有 1 个文件被更改,包括 3 次插入0 次删除
  1. 3 0
      src/lj_gc.c

+ 3 - 0
src/lj_gc.c

@@ -700,9 +700,12 @@ static size_t gc_onestep(lua_State *L)
     }
     }
   case GCSfinalize:
   case GCSfinalize:
     if (gcref(g->gc.mmudata) != NULL) {
     if (gcref(g->gc.mmudata) != NULL) {
+      GCSize old = g->gc.total;
       if (tvref(g->jit_base))  /* Don't call finalizers on trace. */
       if (tvref(g->jit_base))  /* Don't call finalizers on trace. */
 	return LJ_MAX_MEM;
 	return LJ_MAX_MEM;
       gc_finalize(L);  /* Finalize one userdata object. */
       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)
       if (g->gc.estimate > GCFINALIZECOST)
 	g->gc.estimate -= GCFINALIZECOST;
 	g->gc.estimate -= GCFINALIZECOST;
       return GCFINALIZECOST;
       return GCFINALIZECOST;