From 3679d33b02782ff7d7d0fa163b815902b189c89e Mon Sep 17 00:00:00 2001 From: Roberto Ierusalimschy Date: Tue, 13 Aug 2013 14:36:44 -0300 Subject: barrier conditions rewritten to test first 'isblack' and then 'iswhite' (during a pause all objects are white, so 'isblack' fails much more often than 'iswhite') --- lgc.c | 4 +++- lgc.h | 16 ++++++++-------- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/lgc.c b/lgc.c index 700a329f..75daf796 100644 --- a/lgc.c +++ b/lgc.c @@ -1,5 +1,5 @@ /* -** $Id: lgc.c,v 2.143 2013/08/07 12:18:11 roberto Exp roberto $ +** $Id: lgc.c,v 2.144 2013/08/07 15:39:09 roberto Exp roberto $ ** Garbage Collector ** See Copyright Notice in lua.h */ @@ -63,6 +63,8 @@ #define black2gray(x) resetbit(gch(x)->marked, BLACKBIT) +#define valiswhite(x) (iscollectable(x) && iswhite(gcvalue(x))) + #define isfinalized(x) testbit(gch(x)->marked, FINALIZEDBIT) #define checkdeadkey(n) lua_assert(!ttisdeadkey(gkey(n)) || ttisnil(gval(n))) diff --git a/lgc.h b/lgc.h index bda11607..4e38c0fc 100644 --- a/lgc.h +++ b/lgc.h @@ -1,5 +1,5 @@ /* -** $Id: lgc.h,v 2.58 2012/09/11 12:53:08 roberto Exp roberto $ +** $Id: lgc.h,v 2.59 2013/08/05 16:58:28 roberto Exp roberto $ ** Garbage Collector ** See Copyright Notice in lua.h */ @@ -97,8 +97,6 @@ #define changewhite(x) ((x)->gch.marked ^= WHITEBITS) #define gray2black(x) l_setbit((x)->gch.marked, BLACKBIT) -#define valiswhite(x) (iscollectable(x) && iswhite(gcvalue(x))) - #define luaC_white(g) cast(lu_byte, (g)->currentwhite & WHITEBITS) @@ -107,18 +105,20 @@ #define luaC_checkGC(L) luaC_condGC(L, luaC_step(L);) -#define luaC_barrier(L,p,v) { if (valiswhite(v) && isblack(obj2gco(p))) \ +#define luaC_barrier(L,p,v) { \ + if (iscollectable(v) && isblack(obj2gco(p)) && iswhite(gcvalue(v))) \ luaC_barrier_(L,obj2gco(p),gcvalue(v)); } -#define luaC_barrierback(L,p,v) { if (valiswhite(v) && isblack(obj2gco(p))) \ +#define luaC_barrierback(L,p,v) { \ + if (iscollectable(v) && isblack(obj2gco(p)) && iswhite(gcvalue(v))) \ luaC_barrierback_(L,p); } -#define luaC_objbarrier(L,p,o) \ - { if (iswhite(obj2gco(o)) && isblack(obj2gco(p))) \ +#define luaC_objbarrier(L,p,o) { \ + if (isblack(obj2gco(p)) && iswhite(obj2gco(o))) \ luaC_barrier_(L,obj2gco(p),obj2gco(o)); } #define luaC_objbarrierback(L,p,o) \ - { if (iswhite(obj2gco(o)) && isblack(obj2gco(p))) luaC_barrierback_(L,p); } + { if (isblack(obj2gco(p)) && iswhite(obj2gco(o))) luaC_barrierback_(L,p); } #define luaC_barrierproto(L,p,c) \ { if (isblack(obj2gco(p))) luaC_barrierproto_(L,p,c); } -- cgit v1.2.3-55-g6feb