aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2013-08-13 14:36:44 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2013-08-13 14:36:44 -0300
commit3679d33b02782ff7d7d0fa163b815902b189c89e (patch)
tree338eba3fe410d3358da9189eb64ccc928742d4de
parent78b941039d732b01933baa44e2f14ae206e4d1f2 (diff)
downloadlua-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.c4
-rw-r--r--lgc.h16
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 @@
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)))
diff --git a/lgc.h b/lgc.h
index bda11607..4e38c0fc 100644
--- a/lgc.h
+++ b/lgc.h
@@ -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); }