diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2013-08-13 14:36:44 -0300 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2013-08-13 14:36:44 -0300 |
commit | 3679d33b02782ff7d7d0fa163b815902b189c89e (patch) | |
tree | 338eba3fe410d3358da9189eb64ccc928742d4de | |
parent | 78b941039d732b01933baa44e2f14ae206e4d1f2 (diff) | |
download | lua-3679d33b02782ff7d7d0fa163b815902b189c89e.tar.gz lua-3679d33b02782ff7d7d0fa163b815902b189c89e.tar.bz2 lua-3679d33b02782ff7d7d0fa163b815902b189c89e.zip |
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')
-rw-r--r-- | lgc.c | 4 | ||||
-rw-r--r-- | lgc.h | 16 |
2 files changed, 11 insertions, 9 deletions
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lgc.c,v 2.143 2013/08/07 12:18:11 roberto Exp roberto $ | 2 | ** $Id: lgc.c,v 2.144 2013/08/07 15:39:09 roberto Exp roberto $ |
3 | ** Garbage Collector | 3 | ** Garbage Collector |
4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
5 | */ | 5 | */ |
@@ -63,6 +63,8 @@ | |||
63 | #define black2gray(x) resetbit(gch(x)->marked, BLACKBIT) | 63 | #define black2gray(x) resetbit(gch(x)->marked, BLACKBIT) |
64 | 64 | ||
65 | 65 | ||
66 | #define valiswhite(x) (iscollectable(x) && iswhite(gcvalue(x))) | ||
67 | |||
66 | #define isfinalized(x) testbit(gch(x)->marked, FINALIZEDBIT) | 68 | #define isfinalized(x) testbit(gch(x)->marked, FINALIZEDBIT) |
67 | 69 | ||
68 | #define checkdeadkey(n) lua_assert(!ttisdeadkey(gkey(n)) || ttisnil(gval(n))) | 70 | #define checkdeadkey(n) lua_assert(!ttisdeadkey(gkey(n)) || ttisnil(gval(n))) |
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lgc.h,v 2.58 2012/09/11 12:53:08 roberto Exp roberto $ | 2 | ** $Id: lgc.h,v 2.59 2013/08/05 16:58:28 roberto Exp roberto $ |
3 | ** Garbage Collector | 3 | ** Garbage Collector |
4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
5 | */ | 5 | */ |
@@ -97,8 +97,6 @@ | |||
97 | #define changewhite(x) ((x)->gch.marked ^= WHITEBITS) | 97 | #define changewhite(x) ((x)->gch.marked ^= WHITEBITS) |
98 | #define gray2black(x) l_setbit((x)->gch.marked, BLACKBIT) | 98 | #define gray2black(x) l_setbit((x)->gch.marked, BLACKBIT) |
99 | 99 | ||
100 | #define valiswhite(x) (iscollectable(x) && iswhite(gcvalue(x))) | ||
101 | |||
102 | #define luaC_white(g) cast(lu_byte, (g)->currentwhite & WHITEBITS) | 100 | #define luaC_white(g) cast(lu_byte, (g)->currentwhite & WHITEBITS) |
103 | 101 | ||
104 | 102 | ||
@@ -107,18 +105,20 @@ | |||
107 | #define luaC_checkGC(L) luaC_condGC(L, luaC_step(L);) | 105 | #define luaC_checkGC(L) luaC_condGC(L, luaC_step(L);) |
108 | 106 | ||
109 | 107 | ||
110 | #define luaC_barrier(L,p,v) { if (valiswhite(v) && isblack(obj2gco(p))) \ | 108 | #define luaC_barrier(L,p,v) { \ |
109 | if (iscollectable(v) && isblack(obj2gco(p)) && iswhite(gcvalue(v))) \ | ||
111 | luaC_barrier_(L,obj2gco(p),gcvalue(v)); } | 110 | luaC_barrier_(L,obj2gco(p),gcvalue(v)); } |
112 | 111 | ||
113 | #define luaC_barrierback(L,p,v) { if (valiswhite(v) && isblack(obj2gco(p))) \ | 112 | #define luaC_barrierback(L,p,v) { \ |
113 | if (iscollectable(v) && isblack(obj2gco(p)) && iswhite(gcvalue(v))) \ | ||
114 | luaC_barrierback_(L,p); } | 114 | luaC_barrierback_(L,p); } |
115 | 115 | ||
116 | #define luaC_objbarrier(L,p,o) \ | 116 | #define luaC_objbarrier(L,p,o) { \ |
117 | { if (iswhite(obj2gco(o)) && isblack(obj2gco(p))) \ | 117 | if (isblack(obj2gco(p)) && iswhite(obj2gco(o))) \ |
118 | luaC_barrier_(L,obj2gco(p),obj2gco(o)); } | 118 | luaC_barrier_(L,obj2gco(p),obj2gco(o)); } |
119 | 119 | ||
120 | #define luaC_objbarrierback(L,p,o) \ | 120 | #define luaC_objbarrierback(L,p,o) \ |
121 | { if (iswhite(obj2gco(o)) && isblack(obj2gco(p))) luaC_barrierback_(L,p); } | 121 | { if (isblack(obj2gco(p)) && iswhite(obj2gco(o))) luaC_barrierback_(L,p); } |
122 | 122 | ||
123 | #define luaC_barrierproto(L,p,c) \ | 123 | #define luaC_barrierproto(L,p,c) \ |
124 | { if (isblack(obj2gco(p))) luaC_barrierproto_(L,p,c); } | 124 | { if (isblack(obj2gco(p))) luaC_barrierproto_(L,p,c); } |