[Tarantool-patches] [PATCH v3 1/2] core: introduce various platform metrics

Sergey Kaplun skaplun at tarantool.org
Mon Oct 5 09:36:50 MSK 2020


On 20.09.20, Sergey Kaplun wrote:
> This patch introduces the following counters:
<snipped>
> 

This patch isn't relevant. You can see actual version here [1].

You can apply -R corresponding diff to return to this version.
==================================================================
diff --git a/src/lj_asm_arm.h b/src/lj_asm_arm.h
index 62f269e..4fd08b9 100644
--- a/src/lj_asm_arm.h
+++ b/src/lj_asm_arm.h
@@ -1289,18 +1289,6 @@ static void asm_tbar(ASMState *as, IRIns *ir)
 		     rset_exclude(rset_exclude(RSET_GPR, tab), link));
   Reg mark = RID_TMP;
   MCLabel l_end = emit_label(as);
-  emit_lso(as, ARMI_STR, RID_TMP, gr,
-	   (int32_t)offsetof(global_State, gc.graynum));
-  emit_dn(as, ARMI_ADD|ARMI_K12|1, RID_TMP, RID_TMP);
-  emit_lso(as, ARMI_LDR, RID_TMP, gr,
-	   (int32_t)offsetof(global_State, gc.graynum));
-
-  emit_lso(as, ARMI_STR, RID_TMP, gr,
-	   (int32_t)offsetof(global_State, gc.blacknum));
-  emit_dn(as, ARMI_SUB|ARMI_K12|1, RID_TMP, RID_TMP);
-  emit_lso(as, ARMI_LDR, RID_TMP, gr,
-	   (int32_t)offsetof(global_State, gc.blacknum));
-
   emit_lso(as, ARMI_STR, link, tab, (int32_t)offsetof(GCtab, gclist));
   emit_lso(as, ARMI_STRB, mark, tab, (int32_t)offsetof(GCtab, marked));
   emit_lso(as, ARMI_STR, tab, gr,
diff --git a/src/lj_asm_arm64.h b/src/lj_asm_arm64.h
index 6be912e..a32ba2d 100644
--- a/src/lj_asm_arm64.h
+++ b/src/lj_asm_arm64.h
@@ -1252,18 +1252,6 @@ static void asm_tbar(ASMState *as, IRIns *ir)
 		     rset_exclude(rset_exclude(RSET_GPR, tab), link));
   Reg mark = RID_TMP;
   MCLabel l_end = emit_label(as);
-  emit_lso(as, A64I_STRx, RID_TMP, gr,
-	   (int32_t)offsetof(global_State, gc.graynum));
-  emit_dn(as, (A64I_ADDx^A64I_K12) | A64F_U12(1), RID_TMP, RID_TMP);
-  emit_lso(as, A64I_LDRx, RID_TMP, gr,
-	   (int32_t)offsetof(global_State, gc.graynum));
-
-  emit_lso(as, A64I_STRx, RID_TMP, gr,
-	   (int32_t)offsetof(global_State, gc.blacknum));
-  emit_dn(as, (A64I_SUBx^A64I_K12) | A64F_U12(1), RID_TMP, RID_TMP);
-  emit_lso(as, A64I_LDRx, RID_TMP, gr,
-	   (int32_t)offsetof(global_State, gc.blacknum));
-
   emit_lso(as, A64I_STRx, link, tab, (int32_t)offsetof(GCtab, gclist));
   emit_lso(as, A64I_STRB, mark, tab, (int32_t)offsetof(GCtab, marked));
   emit_lso(as, A64I_STRx, tab, gr,
diff --git a/src/lj_asm_mips.h b/src/lj_asm_mips.h
index 0a1900f..f4b4b5d 100644
--- a/src/lj_asm_mips.h
+++ b/src/lj_asm_mips.h
@@ -1504,12 +1504,6 @@ static void asm_tbar(ASMState *as, IRIns *ir)
   emit_tsi(as, MIPSI_SB, mark, tab, (int32_t)offsetof(GCtab, marked));
   emit_setgl(as, tab, gc.grayagain);
   emit_getgl(as, link, gc.grayagain);
-  emit_setgl(as, RID_TMP, gc.graynum);
-  emit_tsi(as, MIPSI_AADDIU, RID_TMP, RID_TMP, 1);
-  emit_getgl(as, RID_TMP, gc.graynum);
-  emit_setgl(as, RID_TMP, gc.blacknum);
-  emit_tsi(as, MIPSI_AADDIU, RID_TMP, RID_TMP, -1);
-  emit_getgl(as, RID_TMP, gc.blacknum);
   emit_dst(as, MIPSI_XOR, mark, mark, RID_TMP);  /* Clear black bit. */
   emit_branch(as, MIPSI_BEQ, RID_TMP, RID_ZERO, l_end);
   emit_tsi(as, MIPSI_ANDI, RID_TMP, mark, LJ_GC_BLACK);
diff --git a/src/lj_asm_ppc.h b/src/lj_asm_ppc.h
index be4b872..aa2d45c 100644
--- a/src/lj_asm_ppc.h
+++ b/src/lj_asm_ppc.h
@@ -1089,12 +1089,6 @@ static void asm_tbar(ASMState *as, IRIns *ir)
   lua_assert(LJ_GC_BLACK == 0x04);
   emit_rot(as, PPCI_RLWINM, mark, mark, 0, 30, 28);  /* Clear black bit. */
   emit_getgl(as, link, gc.grayagain);
-  emit_setgl(as, RID_TMP, gc.graynum);
-  emit_tai(as, PPCI_ADDIC, RID_TMP, RID_TMP, 1);
-  emit_getgl(as, RID_TMP, gc.graynum);
-  emit_setgl(as, RID_TMP, gc.blacknum);
-  emit_tai(as, PPCI_ADDIC, RID_TMP, RID_TMP, -1);
-  emit_getgl(as, RID_TMP, gc.blacknum);
   emit_condbranch(as, PPCI_BC|PPCF_Y, CC_EQ, l_end);
   emit_asi(as, PPCI_ANDIDOT, RID_TMP, mark, LJ_GC_BLACK);
   emit_tai(as, PPCI_LBZ, mark, tab, (int32_t)offsetof(GCtab, marked));
diff --git a/src/lj_asm_x86.h b/src/lj_asm_x86.h
index 8c9cdaa..959fc2d 100644
--- a/src/lj_asm_x86.h
+++ b/src/lj_asm_x86.h
@@ -1865,12 +1865,6 @@ static void asm_tbar(ASMState *as, IRIns *ir)
   emit_movtomro(as, tmp|REX_GC64, tab, offsetof(GCtab, gclist));
   emit_setgl(as, tab, gc.grayagain);
   emit_getgl(as, tmp, gc.grayagain);
-  emit_i8(as, 1);
-  emit_rmro(as, XO_ARITHi8, XOg_ADD, RID_NONE,
-	    ptr2addr(&J2G(as->J)->gc.graynum));
-  emit_i8(as, 1);
-  emit_rmro(as, XO_ARITHi8, XOg_SUB, RID_NONE,
-	    ptr2addr(&J2G(as->J)->gc.blacknum));
   emit_i8(as, ~LJ_GC_BLACK);
   emit_rmro(as, XO_ARITHib, XOg_AND, tab, offsetof(GCtab, marked));
   emit_sjcc(as, CC_Z, l_end);
diff --git a/src/lj_cdata.c b/src/lj_cdata.c
index 5870ac4..0dd8553 100644
--- a/src/lj_cdata.c
+++ b/src/lj_cdata.c
@@ -64,13 +64,6 @@ void LJ_FASTCALL lj_cdata_free(global_State *g, GCcdata *cd)
 {
   if (LJ_UNLIKELY(cd->marked & LJ_GC_CDATA_FIN)) {
     GCobj *root;
-    /* Restore old value of color incremented before free. */
-      if (iswhite(obj2gco(cd)))
-	g->gc.whitenum++;
-      else if (isblack(obj2gco(cd)))
-	g->gc.blacknum++;
-      else
-	g->gc.graynum++;
     makewhite(g, obj2gco(cd));
     markfinalized(obj2gco(cd));
     if ((root = gcref(g->gc.mmudata)) != NULL) {
diff --git a/src/lj_gc.c b/src/lj_gc.c
index c7616f6..44c8aa1 100644
--- a/src/lj_gc.c
+++ b/src/lj_gc.c
@@ -33,18 +33,8 @@
 #define GCFINALIZECOST	100
 
 /* Macros to set GCobj colors and flags. */
-#define white2gray(g, x) \
-  ( (g)->gc.whitenum--, \
-    (g)->gc.graynum++, \
-    lua_assert((ssize_t)(g)->gc.whitenum >=2), \
-    (x)->gch.marked &= (uint8_t)~LJ_GC_WHITES )
-
-#define gray2black(g, x) \
-  ( (g)->gc.graynum--, \
-    (g)->gc.blacknum++, \
-    lua_assert((ssize_t)(g)->gc.graynum >=0), \
-    (x)->gch.marked |= LJ_GC_BLACK )
-
+#define white2gray(x)		((x)->gch.marked &= (uint8_t)~LJ_GC_WHITES)
+#define gray2black(x)		((x)->gch.marked |= LJ_GC_BLACK)
 #define isfinalized(u)		((u)->marked & LJ_GC_FINALIZED)
 
 /* -- Mark phase ---------------------------------------------------------- */
@@ -59,30 +49,24 @@
   { if (iswhite(obj2gco(o))) gc_mark(g, obj2gco(o)); }
 
 /* Mark a string object. */
-#define gc_mark_str(g, s) \
-  { if ((s)->marked & LJ_GC_WHITES) { \
-      (g)->gc.whitenum--; \
-      (g)->gc.graynum++; \
-      lua_assert((ssize_t)(g)->gc.whitenum >=2); \
-    }; \
-    (s)->marked &= (uint8_t)~LJ_GC_WHITES; }
+#define gc_mark_str(s)		((s)->marked &= (uint8_t)~LJ_GC_WHITES)
 
 /* Mark a white GCobj. */
 static void gc_mark(global_State *g, GCobj *o)
 {
   int gct = o->gch.gct;
   lua_assert(iswhite(o) && !isdead(g, o));
-  white2gray(g, o);
+  white2gray(o);
   if (LJ_UNLIKELY(gct == ~LJ_TUDATA)) {
     GCtab *mt = tabref(gco2ud(o)->metatable);
-    gray2black(g, o);  /* Userdata are never gray. */
+    gray2black(o);  /* Userdata are never gray. */
     if (mt) gc_markobj(g, mt);
     gc_markobj(g, tabref(gco2ud(o)->env));
   } else if (LJ_UNLIKELY(gct == ~LJ_TUPVAL)) {
     GCupval *uv = gco2uv(o);
     gc_marktv(g, uvval(uv));
     if (uv->closed)
-      gray2black(g, o);  /* Closed upvalues are never gray. */
+      gray2black(o);  /* Closed upvalues are never gray. */
   } else if (gct != ~LJ_TSTR && gct != ~LJ_TCDATA) {
     lua_assert(gct == ~LJ_TFUNC || gct == ~LJ_TTAB ||
 	       gct == ~LJ_TTHREAD || gct == ~LJ_TPROTO || gct == ~LJ_TTRACE);
@@ -246,7 +230,7 @@ static void gc_marktrace(global_State *g, TraceNo traceno)
   GCobj *o = obj2gco(traceref(G2J(g), traceno));
   lua_assert(traceno != G2J(g)->cur.traceno);
   if (iswhite(o)) {
-    white2gray(g, o);
+    white2gray(o);
     setgcrefr(o->gch.gclist, g->gc.gray);
     setgcref(g->gc.gray, o);
   }
@@ -280,7 +264,7 @@ static void gc_traverse_trace(global_State *g, GCtrace *T)
 static void gc_traverse_proto(global_State *g, GCproto *pt)
 {
   ptrdiff_t i;
-  gc_mark_str(g, proto_chunkname(pt));
+  gc_mark_str(proto_chunkname(pt));
   for (i = -(ptrdiff_t)pt->sizekgc; i < 0; i++)  /* Mark collectable consts. */
     gc_markobj(g, proto_kgc(pt, i));
 #if LJ_HASJIT
@@ -326,12 +310,12 @@ static size_t propagatemark(global_State *g)
   GCobj *o = gcref(g->gc.gray);
   int gct = o->gch.gct;
   lua_assert(isgray(o));
-  gray2black(g, o);
+  gray2black(o);
   setgcrefr(g->gc.gray, o->gch.gclist);  /* Remove from gray list. */
   if (LJ_LIKELY(gct == ~LJ_TTAB)) {
     GCtab *t = gco2tab(o);
     if (gc_traverse_tab(g, t) > 0)
-      black2gray(g, o);  /* Keep weak tables gray. */
+      black2gray(o);  /* Keep weak tables gray. */
     return sizeof(GCtab) + sizeof(TValue) * t->asize +
 			   (t->hmask ? sizeof(Node) * (t->hmask + 1) : 0);
   } else if (LJ_LIKELY(gct == ~LJ_TFUNC)) {
@@ -347,7 +331,7 @@ static size_t propagatemark(global_State *g)
     lua_State *th = gco2th(o);
     setgcrefr(th->gclist, g->gc.grayagain);
     setgcref(g->gc.grayagain, o);
-    black2gray(g, o);  /* Threads are never black. */
+    black2gray(o);  /* Threads are never black. */
     gc_traverse_thread(g, th);
     return sizeof(lua_State) + sizeof(TValue) * th->stacksize;
   } else {
@@ -419,16 +403,6 @@ static GCRef *gc_sweep(global_State *g, GCRef *p, uint32_t lim)
       setgcrefr(*p, o->gch.nextgc);
       if (o == gcref(g->gc.root))
 	setgcrefr(g->gc.root, o->gch.nextgc);  /* Adjust list anchor. */
-      if (iswhite(o)) {
-	g->gc.whitenum--;
-	lua_assert((ssize_t)g->gc.whitenum >= 2);
-      } else if (isblack(o)) {
-	g->gc.blacknum--;
-	lua_assert((ssize_t)g->gc.blacknum >= 0);
-      } else {
-	g->gc.graynum--;
-	lua_assert((ssize_t)g->gc.graynum >= 0);
-      }
       gc_freefunc[o->gch.gct - ~LJ_TSTR](g, o);
     }
   }
@@ -456,16 +430,6 @@ static GCRef *gc_sweep_str_chain(global_State *g, GCRef *p)
     } else {  /* Otherwise value is dead, free it. */
       lua_assert(isdead(g, o) || ow == LJ_GC_SFIXED);
       setgcrefr(*p, o->gch.nextgc);
-      if (iswhite(o)) {
-	g->gc.whitenum--;
-	lua_assert((ssize_t)g->gc.whitenum >= 2);
-      } else if (isblack(o)) {
-	g->gc.blacknum--;
-	lua_assert((ssize_t)g->gc.blacknum >= 0);
-      } else {
-	g->gc.graynum--;
-	lua_assert((ssize_t)g->gc.graynum >= 0);
-      }
       lj_str_free(g, &o->str);
     }
   }
@@ -473,11 +437,11 @@ static GCRef *gc_sweep_str_chain(global_State *g, GCRef *p)
 }
 
 /* Check whether we can clear a key or a value slot from a table. */
-static int gc_mayclear(global_State *g, cTValue *o, int val)
+static int gc_mayclear(cTValue *o, int val)
 {
   if (tvisgcv(o)) {  /* Only collectable objects can be weak references. */
     if (tvisstr(o)) {  /* But strings cannot be used as weak references. */
-      gc_mark_str(g, strV(o));  /* And need to be marked. */
+      gc_mark_str(strV(o));  /* And need to be marked. */
       return 0;
     }
     if (iswhite(gcV(o)))
@@ -489,7 +453,7 @@ static int gc_mayclear(global_State *g, cTValue *o, int val)
 }
 
 /* Clear collected entries from weak tables. */
-static void gc_clearweak(global_State *g, GCobj *o)
+static void gc_clearweak(GCobj *o)
 {
   while (o) {
     GCtab *t = gco2tab(o);
@@ -499,7 +463,7 @@ static void gc_clearweak(global_State *g, GCobj *o)
       for (i = 0; i < asize; i++) {
 	/* Clear array slot when value is about to be collected. */
 	TValue *tv = arrayslot(t, i);
-	if (gc_mayclear(g, tv, 1))
+	if (gc_mayclear(tv, 1))
 	  setnilV(tv);
       }
     }
@@ -509,8 +473,8 @@ static void gc_clearweak(global_State *g, GCobj *o)
       for (i = 0; i <= hmask; i++) {
 	Node *n = &node[i];
 	/* Clear hash slot when key or value is about to be collected. */
-	if (!tvisnil(&n->val) && (gc_mayclear(g, &n->key, 0) ||
-				  gc_mayclear(g, &n->val, 1)))
+	if (!tvisnil(&n->val) && (gc_mayclear(&n->key, 0) ||
+				  gc_mayclear(&n->val, 1)))
 	  setnilV(&n->val);
       }
     }
@@ -655,21 +619,12 @@ static void atomic(global_State *g, lua_State *L)
   udsize += gc_propagate_gray(g);  /* And propagate the marks. */
 
   /* All marking done, clear weak tables. */
-  gc_clearweak(g, gcref(g->gc.weak));
+  gc_clearweak(gcref(g->gc.weak));
 
   lj_buf_shrink(L, &g->tmpbuf);  /* Shrink temp buffer. */
 
   /* Prepare for sweep phase. */
   g->gc.currentwhite = (uint8_t)otherwhite(g);  /* Flip current white. */
-  if (g->strempty.marked & (uint8_t)LJ_GC_BLACK) {
-    g->gc.blacknum--;
-    g->gc.whitenum++;
-    lua_assert((ssize_t)g->gc.blacknum >=0);
-  } else if ((g->strempty.marked & (uint8_t)LJ_GC_WHITES) == 0) {
-    g->gc.graynum--;
-    g->gc.whitenum++;
-    lua_assert((ssize_t)g->gc.graynum >=0);
-  }
   g->strempty.marked = g->gc.currentwhite;
   setmref(g->gc.sweep, &g->gc.root);
   g->gc.estimate = g->gc.total - (GCSize)udsize;  /* Initial estimate. */
@@ -854,18 +809,8 @@ void LJ_FASTCALL lj_gc_barrieruv(global_State *g, TValue *tv)
   (*((uint8_t *)(x) - offsetof(GCupval, tv) + offsetof(GCupval, marked)))
   if (g->gc.state == GCSpropagate || g->gc.state == GCSatomic)
     gc_mark(g, gcV(tv));
-  else {
-    if (TV2MARKED(tv) & (uint8_t)LJ_GC_BLACK) {
-      g->gc.blacknum--;
-      g->gc.whitenum++;
-      lua_assert((ssize_t)g->gc.blacknum >=0);
-    } else if ((TV2MARKED(tv) & (uint8_t)LJ_GC_WHITES) == 0) {
-      g->gc.graynum--;
-      g->gc.whitenum++;
-      lua_assert((ssize_t)g->gc.graynum >=0);
-    }
+  else
     TV2MARKED(tv) = (TV2MARKED(tv) & (uint8_t)~LJ_GC_COLORS) | curwhite(g);
-  }
 #undef TV2MARKED
 }
 
@@ -881,7 +826,7 @@ void lj_gc_closeuv(global_State *g, GCupval *uv)
   setgcref(g->gc.root, o);
   if (isgray(o)) {  /* A closed upvalue is never gray, so fix this. */
     if (g->gc.state == GCSpropagate || g->gc.state == GCSatomic) {
-      gray2black(g, o);  /* Make it black and preserve invariant. */
+      gray2black(o);  /* Make it black and preserve invariant. */
       if (tviswhite(&uv->tv))
 	lj_gc_barrierf(g, o, gcV(&uv->tv));
     } else {
diff --git a/src/lj_gc.h b/src/lj_gc.h
index 25e319a..2051220 100644
--- a/src/lj_gc.h
+++ b/src/lj_gc.h
@@ -32,28 +32,11 @@
 #define isdead(g, v)	((v)->gch.marked & otherwhite(g) & LJ_GC_WHITES)
 
 #define curwhite(g)	((g)->gc.currentwhite & LJ_GC_WHITES)
-#define newwhite(g, x) \
-  ( (g)->gc.whitenum++, \
-    obj2gco(x)->gch.marked = (uint8_t)curwhite(g) )
-
+#define newwhite(g, x)	(obj2gco(x)->gch.marked = (uint8_t)curwhite(g))
 #define makewhite(g, x) \
-  ( iswhite(x) ? /* Nothing to do */ : \
-    isblack(x) ? ((g)->gc.blacknum--, (g)->gc.whitenum++) : \
-    (lua_assert(isgray(x)), (g)->gc.graynum--, (g)->gc.whitenum++), \
-    lua_assert((ssize_t)(g)->gc.graynum >=0), \
-    lua_assert((ssize_t)(g)->gc.blacknum >=0), \
-    (x)->gch.marked = ((x)->gch.marked & (uint8_t)~LJ_GC_COLORS) | curwhite(g) )
-
-#define flipwhite(x) \
-  ( lua_assert(!isgray(x) && ! isblack(x)), \
-    (x)->gch.marked ^= LJ_GC_WHITES )
-
-#define black2gray(g, x) \
-  ( (g)->gc.blacknum--, \
-    (g)->gc.graynum++, \
-    lua_assert((ssize_t)(g)->gc.blacknum >=0), \
-    (x)->gch.marked &= (uint8_t)~LJ_GC_BLACK )
-
+  ((x)->gch.marked = ((x)->gch.marked & (uint8_t)~LJ_GC_COLORS) | curwhite(g))
+#define flipwhite(x)	((x)->gch.marked ^= LJ_GC_WHITES)
+#define black2gray(x)	((x)->gch.marked &= (uint8_t)~LJ_GC_BLACK)
 #define fixstring(s)	((s)->marked |= LJ_GC_FIXED)
 #define markfinalized(x)	((x)->gch.marked |= LJ_GC_FINALIZED)
 
@@ -95,7 +78,7 @@ static LJ_AINLINE void lj_gc_barrierback(global_State *g, GCtab *t)
   GCobj *o = obj2gco(t);
   lua_assert(isblack(o) && !isdead(g, o));
   lua_assert(g->gc.state != GCSfinalize && g->gc.state != GCSpause);
-  black2gray(g, o);
+  black2gray(o);
   setgcrefr(t->gclist, g->gc.grayagain);
   setgcref(g->gc.grayagain, o);
 }
diff --git a/src/lj_obj.h b/src/lj_obj.h
index c9a6904..600b68d 100644
--- a/src/lj_obj.h
+++ b/src/lj_obj.h
@@ -609,9 +609,6 @@ typedef struct GCState {
 #ifdef LJ_HASFFI
   size_t cdatanum;	/* Amount of allocated cdata objects. */
 #endif
-  size_t whitenum;	/* Amount of white objects. */
-  size_t graynum;	/* Amount of grey objects. */
-  size_t blacknum;	/* Amount of black objects. */
 } GCState;
 
 /* Global state, shared by all threads of a Lua universe. */
@@ -630,7 +627,6 @@ typedef struct global_State {
   lua_Alloc allocf;	/* Memory allocator. */
   void *allocd;		/* Memory allocator data. */
   GCState gc;		/* Garbage collector. */
-  GCRef mainthref;	/* Link to main thread. */
   SBuf tmpbuf;		/* Temporary string buffer. */
   GCstr strempty;	/* Empty string. */
   uint8_t stremptyz;	/* Zero terminator of empty string. */
@@ -638,8 +634,9 @@ typedef struct global_State {
   uint8_t dispatchmode;	/* Dispatch mode. */
   uint8_t vmevmask;	/* VM event mask. */
   int32_t hookcount;	/* Instruction hook countdown. */
+  GCRef mainthref;	/* Link to main thread. */
   TValue registrytv;	/* Anchor for registry. */
-  TValue tmptv, tmptv2;	/* Temporary TValues. */
+  TValue tmptv2, tmptv;	/* Temporary TValues. */
   Node nilnode;		/* Fallback 1-element hash part (nil key and value). */
   GCupval uvhead;	/* Head of double-linked list of all open upvalues. */
   volatile int32_t vmstate;  /* VM state or current JIT code trace number. */
diff --git a/src/lj_state.c b/src/lj_state.c
index d85a02a..1d9c628 100644
--- a/src/lj_state.c
+++ b/src/lj_state.c
@@ -164,10 +164,6 @@ static void close_state(lua_State *L)
   lj_gc_freeall(g);
   lua_assert(gcref(g->gc.root) == obj2gco(L));
   lua_assert(g->strnum == 0);
-  lua_assert(g->gc.blacknum == 0);
-  lua_assert(g->gc.graynum == 0);
-  /* At least lua_State, strempty and state enviroment. */
-  lua_assert(g->gc.whitenum >= 2);
   lj_trace_freestate(g);
 #if LJ_HASFFI
   lj_ctype_freestate(g);
@@ -219,7 +215,6 @@ LUA_API lua_State *lua_newstate(lua_Alloc f, void *ud)
   setgcref(g->gc.root, obj2gco(L));
   setmref(g->gc.sweep, &g->gc.root);
   g->gc.allocated = g->gc.total = sizeof(GG_State);
-  g->gc.whitenum = 2; /* State and strempty. */
   g->gc.pause = LUAI_GCPAUSE;
   g->gc.stepmul = LUAI_GCMUL;
   lj_dispatch_init((GG_State *)L);
diff --git a/src/vm_arm.dasc b/src/vm_arm.dasc
index ea3bf31..d4cdaf5 100644
--- a/src/vm_arm.dasc
+++ b/src/vm_arm.dasc
@@ -227,12 +227,6 @@
 |
 |// Move table write barrier back. Overwrites mark and tmp.
 |.macro barrierback, tab, mark, tmp
-|  ldr tmp, [DISPATCH, #DISPATCH_GL(gc.graynum)]
-|  add tmp, tmp, #1
-|  str tmp, [DISPATCH, #DISPATCH_GL(gc.graynum)]
-|  ldr tmp, [DISPATCH, #DISPATCH_GL(gc.blacknum)]
-|  sub tmp, tmp, #1
-|  str tmp, [DISPATCH, #DISPATCH_GL(gc.blacknum)]
 |  ldr tmp, [DISPATCH, #DISPATCH_GL(gc.grayagain)]
 |   bic mark, mark, #LJ_GC_BLACK		// black2gray(tab)
 |  str tab, [DISPATCH, #DISPATCH_GL(gc.grayagain)]
diff --git a/src/vm_arm64.dasc b/src/vm_arm64.dasc
index a182f35..3eaf376 100644
--- a/src/vm_arm64.dasc
+++ b/src/vm_arm64.dasc
@@ -280,12 +280,6 @@
 |
 |// Move table write barrier back. Overwrites mark and tmp.
 |.macro barrierback, tab, mark, tmp
-|  ldr tmp, GL->gc.blacknum
-|  sub tmp, tmp, #1
-|  str tmp, GL->gc.blacknum
-|  ldr tmp, GL->gc.graynum
-|  add tmp, tmp, #1
-|  str tmp, GL->gc.graynum
 |  ldr tmp, GL->gc.grayagain
 |   and mark, mark, #~LJ_GC_BLACK	// black2gray(tab)
 |  str tab, GL->gc.grayagain
diff --git a/src/vm_mips.dasc b/src/vm_mips.dasc
index 7de8beb..1afd611 100644
--- a/src/vm_mips.dasc
+++ b/src/vm_mips.dasc
@@ -351,12 +351,6 @@
 |
 |// Move table write barrier back. Overwrites mark and tmp.
 |.macro barrierback, tab, mark, tmp, target
-|  lw tmp, DISPATCH_GL(gc.blacknum)(DISPATCH)
-|  addiu tmp, tmp, -1
-|  sw tmp, DISPATCH_GL(gc.blacknum)(DISPATCH)
-|  lw tmp, DISPATCH_GL(gc.graynum)(DISPATCH)
-|  addiu tmp, tmp, 1
-|  sw tmp, DISPATCH_GL(gc.graynum)(DISPATCH)
 |  lw tmp, DISPATCH_GL(gc.grayagain)(DISPATCH)
 |   andi mark, mark, ~LJ_GC_BLACK & 255		// black2gray(tab)
 |  sw tab, DISPATCH_GL(gc.grayagain)(DISPATCH)
diff --git a/src/vm_mips64.dasc b/src/vm_mips64.dasc
index 30cab6c..c06270a 100644
--- a/src/vm_mips64.dasc
+++ b/src/vm_mips64.dasc
@@ -350,12 +350,6 @@
 |
 |// Move table write barrier back. Overwrites mark and tmp.
 |.macro barrierback, tab, mark, tmp, target
-|  ld tmp, DISPATCH_GL(gc.blacknum)(DISPATCH)
-|  addiu tmp, tmp, -1
-|  sd tmp, DISPATCH_GL(gc.blacknum)(DISPATCH)
-|  ld tmp, DISPATCH_GL(gc.graynum)(DISPATCH)
-|  addiu tmp, tmp, 1
-|  sd tmp, DISPATCH_GL(gc.graynum)(DISPATCH)
 |  ld tmp, DISPATCH_GL(gc.grayagain)(DISPATCH)
 |   andi mark, mark, ~LJ_GC_BLACK & 255		// black2gray(tab)
 |  sd tab, DISPATCH_GL(gc.grayagain)(DISPATCH)
diff --git a/src/vm_ppc.dasc b/src/vm_ppc.dasc
index 3015869..b4260eb 100644
--- a/src/vm_ppc.dasc
+++ b/src/vm_ppc.dasc
@@ -474,12 +474,6 @@
 |
 |// Move table write barrier back. Overwrites mark and tmp.
 |.macro barrierback, tab, mark, tmp
-|  lwz tmp, DISPATCH_GL(gc.graynum)(DISPATCH)
-|    addic tmp, tmp, 1
-|  stw tmp, DISPATCH_GL(gc.graynum)(DISPATCH)
-|  lwz tmp, DISPATCH_GL(gc.blacknum)(DISPATCH)
-|    subic tmp, tmp, 1
-|  stw tmp, DISPATCH_GL(gc.blacknum)(DISPATCH)
 |  lwz tmp, DISPATCH_GL(gc.grayagain)(DISPATCH)
 |  // Assumes LJ_GC_BLACK is 0x04.
 |   rlwinm mark, mark, 0, 30, 28		// black2gray(tab)
diff --git a/src/vm_x64.dasc b/src/vm_x64.dasc
index d37b310..80753e0 100644
--- a/src/vm_x64.dasc
+++ b/src/vm_x64.dasc
@@ -372,8 +372,6 @@
 |// Move table write barrier back. Overwrites reg.
 |.macro barrierback, tab, reg
 |  and byte tab->marked, (uint8_t)~LJ_GC_BLACK	// black2gray(tab)
-|  sub qword [DISPATCH+DISPATCH_GL(gc.blacknum)], 1
-|  add qword [DISPATCH+DISPATCH_GL(gc.graynum)], 1
 |  mov reg, [DISPATCH+DISPATCH_GL(gc.grayagain)]
 |  mov [DISPATCH+DISPATCH_GL(gc.grayagain)], tab
 |  mov tab->gclist, reg
diff --git a/src/vm_x86.dasc b/src/vm_x86.dasc
index 3e35cc6..56bee14 100644
--- a/src/vm_x86.dasc
+++ b/src/vm_x86.dasc
@@ -477,8 +477,6 @@
 |// Move table write barrier back. Overwrites reg.
 |.macro barrierback, tab, reg
 |  and byte tab->marked, (uint8_t)~LJ_GC_BLACK	// black2gray(tab)
-|  sub dword [DISPATCH+DISPATCH_GL(gc.blacknum)], 1
-|  add dword [DISPATCH+DISPATCH_GL(gc.graynum)], 1
 |  mov reg, [DISPATCH+DISPATCH_GL(gc.grayagain)]
 |  mov [DISPATCH+DISPATCH_GL(gc.grayagain)], tab
 |  mov tab->gclist, reg
==================================================================

[1]: https://lists.tarantool.org/pipermail/tarantool-patches/2020-October/019881.html

-- 
Best regards,
Sergey Kaplun


More information about the Tarantool-patches mailing list