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); } |
