Переглянути джерело

update: 换个方式在resize box内执行GC

Wendal Chen 5 роки тому
батько
коміт
9091512ff0
2 змінених файлів з 20 додано та 5 видалено
  1. 12 5
      lua/src/lauxlib.c
  2. 8 0
      lua/src/lgc.c

+ 12 - 5
lua/src/lauxlib.c

@@ -44,7 +44,8 @@
 #define feof    luat_fs_feof
 #define getc    luat_fs_getc
 
-
+#define GC_WHAT_RESIZE_BOX 1
+extern int gc_running;
 
 /*
 ** {======================================================
@@ -482,11 +483,17 @@ static void *resizebox (lua_State *L, int idx, size_t newsize) {
   lua_Alloc allocf = lua_getallocf(L, &ud);
   UBox *box = (UBox *)lua_touserdata(L, idx);
   void *temp = allocf(ud, box->box, box->bsize, newsize);
-  if (temp == NULL && newsize > 0) {  /* allocation error? */
-    lua_gc(L, LUA_GCCOLLECT, 0);
-    lua_gc(L, LUA_GCCOLLECT, 0);
-    temp = allocf(ud, box->box, box->bsize, newsize);
+  //-----------------
+  // if GC is NOT running, call Full GC
+  #if GC_WHAT_RESIZE_BOX
+  if (temp == NULL && newsize > 0) {
+    if (gc_running == 0) {
+      luaC_fullgc(L, 0);
+      temp = allocf(ud, box->box, box->bsize, newsize);
+    }
   }
+  #endif
+  //-----------------
   if (temp == NULL && newsize > 0) {  /* allocation error? */
     resizebox(L, idx, 0);  /* free buffer */
     luaL_error(L, "not enough memory for buffer allocation");

+ 8 - 0
lua/src/lgc.c

@@ -93,6 +93,8 @@
 
 static void reallymarkobject (global_State *g, GCObject *o);
 
+int gc_running = 0;
+
 
 /*
 ** {======================================================
@@ -1157,6 +1159,9 @@ void luaC_step (lua_State *L) {
 ** changed, nothing will be collected).
 */
 void luaC_fullgc (lua_State *L, int isemergency) {
+  //--add by wendal, 2020-11-02
+  gc_running ++;
+  //----------------------
   global_State *g = G(L);
   lua_assert(g->gckind == KGC_NORMAL);
   if (isemergency) g->gckind = KGC_EMERGENCY;  /* set flag */
@@ -1172,6 +1177,9 @@ void luaC_fullgc (lua_State *L, int isemergency) {
   luaC_runtilstate(L, bitmask(GCSpause));  /* finish collection */
   g->gckind = KGC_NORMAL;
   setpause(g);
+  //--add by wendal, 2020-11-02
+  gc_running --;
+  //----------------------
 }
 
 /* }====================================================== */