aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2004-08-10 16:17:23 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2004-08-10 16:17:23 -0300
commit26ae992129d5566ee973c0ff78fd709cd5d91271 (patch)
tree81082d5ee1abaf94175d7cc66ae2331853ce24ab
parentf87057690b3afa7812d0ef5251ce103902a37c96 (diff)
downloadlua-26ae992129d5566ee973c0ff78fd709cd5d91271.tar.gz
lua-26ae992129d5566ee973c0ff78fd709cd5d91271.tar.bz2
lua-26ae992129d5566ee973c0ff78fd709cd5d91271.zip
less conservative write barrier for tables
-rw-r--r--lapi.c6
-rw-r--r--lgc.c34
-rw-r--r--lgc.h6
-rw-r--r--ltable.c4
-rw-r--r--lvm.c6
5 files changed, 38 insertions, 18 deletions
diff --git a/lapi.c b/lapi.c
index 54767481..a21c0c14 100644
--- a/lapi.c
+++ b/lapi.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lapi.c,v 2.13 2004/06/30 14:15:23 roberto Exp roberto $ 2** $Id: lapi.c,v 2.14 2004/07/09 14:20:22 roberto Exp roberto $
3** Lua API 3** Lua API
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -613,7 +613,7 @@ LUA_API void lua_rawset (lua_State *L, int idx) {
613 t = luaA_index(L, idx); 613 t = luaA_index(L, idx);
614 api_check(L, ttistable(t)); 614 api_check(L, ttistable(t));
615 setobj2t(L, luaH_set(L, hvalue(t), L->top-2), L->top-1); 615 setobj2t(L, luaH_set(L, hvalue(t), L->top-2), L->top-1);
616 luaC_barrier(L, hvalue(t), L->top-1); 616 luaC_barriert(L, hvalue(t), L->top-1);
617 L->top -= 2; 617 L->top -= 2;
618 lua_unlock(L); 618 lua_unlock(L);
619} 619}
@@ -626,7 +626,7 @@ LUA_API void lua_rawseti (lua_State *L, int idx, int n) {
626 o = luaA_index(L, idx); 626 o = luaA_index(L, idx);
627 api_check(L, ttistable(o)); 627 api_check(L, ttistable(o));
628 setobj2t(L, luaH_setnum(L, hvalue(o), n), L->top-1); 628 setobj2t(L, luaH_setnum(L, hvalue(o), n), L->top-1);
629 luaC_barrier(L, hvalue(o), L->top-1); 629 luaC_barriert(L, hvalue(o), L->top-1);
630 L->top--; 630 L->top--;
631 lua_unlock(L); 631 lua_unlock(L);
632} 632}
diff --git a/lgc.c b/lgc.c
index 636fd59a..86f4e637 100644
--- a/lgc.c
+++ b/lgc.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lgc.c,v 2.6 2004/03/23 12:57:12 roberto Exp roberto $ 2** $Id: lgc.c,v 2.7 2004/04/30 20:13:38 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*/
@@ -24,9 +24,11 @@
24 24
25 25
26#define GCSTEPSIZE (40*sizeof(TValue)) 26#define GCSTEPSIZE (40*sizeof(TValue))
27#define GCFREECOST (sizeof(TValue)/2) 27#define STEPMUL 2
28#define GCSWEEPCOST sizeof(TValue) 28#define GCFREECOST (sizeof(TValue)/10)
29#define GCSWEEPCOST (sizeof(TValue)/20)
29#define GCFINALIZECOST (10*sizeof(TValue)) 30#define GCFINALIZECOST (10*sizeof(TValue))
31#define WAITNEXTCYCLE (10 * GCSTEPSIZE)
30 32
31 33
32#define FIXEDMASK bitmask(FIXEDBIT) 34#define FIXEDMASK bitmask(FIXEDBIT)
@@ -531,8 +533,10 @@ static void remarkupvals (global_State *g) {
531 if (iswhite(o)) { 533 if (iswhite(o)) {
532 GCObject *curr; 534 GCObject *curr;
533 for (curr = gco2th(o)->openupval; curr != NULL; curr = curr->gch.next) { 535 for (curr = gco2th(o)->openupval; curr != NULL; curr = curr->gch.next) {
534 if (isgray(curr)) 536 if (isgray(curr)) {
535 markvalue(g, gco2uv(curr)->v); 537 UpVal *uv = gco2uv(curr);
538 markvalue(g, uv->v);
539 }
536 } 540 }
537 } 541 }
538 } 542 }
@@ -612,14 +616,16 @@ static l_mem singlestep (lua_State *L, l_mem lim) {
612 616
613void luaC_step (lua_State *L) { 617void luaC_step (lua_State *L) {
614 global_State *g = G(L); 618 global_State *g = G(L);
615 l_mem lim = (g->nblocks - (g->GCthreshold - GCSTEPSIZE)) * 2; 619 l_mem lim = (g->nblocks - (g->GCthreshold - GCSTEPSIZE)) * STEPMUL;
616 do { 620 do {
617 lim = singlestep(L, lim); 621 lim = singlestep(L, lim);
618 if (g->gcstate == GCSfinalize && g->tmudata == NULL) 622 if (g->gcstate == GCSfinalize && g->tmudata == NULL) {
623 lim = -WAITNEXTCYCLE;
619 break; /* do not start new collection */ 624 break; /* do not start new collection */
625 }
620 } while (lim > 0); 626 } while (lim > 0);
621 g->GCthreshold = g->nblocks + GCSTEPSIZE - lim/2; 627 g->GCthreshold = g->nblocks + GCSTEPSIZE - lim/STEPMUL;
622 lua_assert((long)g->nblocks + (long)GCSTEPSIZE >= lim/2); 628 lua_assert((long)g->nblocks + (long)GCSTEPSIZE >= lim/STEPMUL);
623} 629}
624 630
625 631
@@ -648,6 +654,16 @@ void luaC_barrierf (lua_State *L, GCObject *o, GCObject *v) {
648} 654}
649 655
650 656
657void luaC_barrierback (lua_State *L, GCObject *o, GCObject *v) {
658 global_State *g = G(L);
659 lua_assert(isblack(o) && iswhite(v) && !isdead(g, v) && !isdead(g, o));
660 lua_assert(g->gcstate != GCSfinalize);
661 black2gray(o); /* make table gray (again) */
662 gco2h(o)->gclist = g->grayagain;
663 g->grayagain = o;
664}
665
666
651void luaC_link (lua_State *L, GCObject *o, lu_byte tt) { 667void luaC_link (lua_State *L, GCObject *o, lu_byte tt) {
652 global_State *g = G(L); 668 global_State *g = G(L);
653 o->gch.next = g->rootgc; 669 o->gch.next = g->rootgc;
diff --git a/lgc.h b/lgc.h
index f80c95d1..56d5af39 100644
--- a/lgc.h
+++ b/lgc.h
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lgc.h,v 2.4 2004/03/09 17:34:35 roberto Exp roberto $ 2** $Id: lgc.h,v 2.5 2004/03/15 21:04:33 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*/
@@ -77,6 +77,9 @@
77#define luaC_barrier(L,p,v) { if (valiswhite(v) && isblack(obj2gco(p))) \ 77#define luaC_barrier(L,p,v) { if (valiswhite(v) && isblack(obj2gco(p))) \
78 luaC_barrierf(L,obj2gco(p),gcvalue(v)); } 78 luaC_barrierf(L,obj2gco(p),gcvalue(v)); }
79 79
80#define luaC_barriert(L,p,v) { if (valiswhite(v) && isblack(obj2gco(p))) \
81 luaC_barrierback(L,obj2gco(p),gcvalue(v)); }
82
80#define luaC_objbarrier(L,p,o) \ 83#define luaC_objbarrier(L,p,o) \
81 { if (iswhite(obj2gco(o)) && isblack(obj2gco(p))) \ 84 { if (iswhite(obj2gco(o)) && isblack(obj2gco(p))) \
82 luaC_barrierf(L,obj2gco(p),obj2gco(o)); } 85 luaC_barrierf(L,obj2gco(p),obj2gco(o)); }
@@ -89,6 +92,7 @@ void luaC_fullgc (lua_State *L);
89void luaC_link (lua_State *L, GCObject *o, lu_byte tt); 92void luaC_link (lua_State *L, GCObject *o, lu_byte tt);
90void luaC_linkupval (lua_State *L, UpVal *uv); 93void luaC_linkupval (lua_State *L, UpVal *uv);
91void luaC_barrierf (lua_State *L, GCObject *o, GCObject *v); 94void luaC_barrierf (lua_State *L, GCObject *o, GCObject *v);
95void luaC_barrierback (lua_State *L, GCObject *o, GCObject *v);
92 96
93 97
94#endif 98#endif
diff --git a/ltable.c b/ltable.c
index 0d149e9f..67194a8e 100644
--- a/ltable.c
+++ b/ltable.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: ltable.c,v 2.2 2004/03/26 14:02:41 roberto Exp roberto $ 2** $Id: ltable.c,v 2.3 2004/04/30 20:13:38 roberto Exp roberto $
3** Lua tables (hash) 3** Lua tables (hash)
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -375,7 +375,7 @@ static TValue *newkey (lua_State *L, Table *t, const TValue *key) {
375 } 375 }
376 } 376 }
377 setobj2t(L, gkey(mp), key); 377 setobj2t(L, gkey(mp), key);
378 luaC_barrier(L, t, key); 378 luaC_barriert(L, t, key);
379 lua_assert(ttisnil(gval(mp))); 379 lua_assert(ttisnil(gval(mp)));
380 for (;;) { /* correct `firstfree' */ 380 for (;;) { /* correct `firstfree' */
381 if (ttisnil(gkey(t->firstfree))) 381 if (ttisnil(gkey(t->firstfree)))
diff --git a/lvm.c b/lvm.c
index 69aa740a..572012da 100644
--- a/lvm.c
+++ b/lvm.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lvm.c,v 2.10 2004/06/29 17:05:00 roberto Exp roberto $ 2** $Id: lvm.c,v 2.11 2004/06/29 18:49:02 roberto Exp roberto $
3** Lua virtual machine 3** Lua virtual machine
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -150,7 +150,7 @@ StkId luaV_settable (lua_State *L, const TValue *t, TValue *key, StkId val,
150 if (!ttisnil(oldval) || /* result is no nil? */ 150 if (!ttisnil(oldval) || /* result is no nil? */
151 (tm = fasttm(L, h->metatable, TM_NEWINDEX)) == NULL) { /* or no TM? */ 151 (tm = fasttm(L, h->metatable, TM_NEWINDEX)) == NULL) { /* or no TM? */
152 setobj2t(L, oldval, val); 152 setobj2t(L, oldval, val);
153 luaC_barrier(L, h, val); 153 luaC_barriert(L, h, val);
154 return L->base; 154 return L->base;
155 } 155 }
156 /* else will try the tag method */ 156 /* else will try the tag method */
@@ -729,7 +729,7 @@ StkId luaV_execute (lua_State *L, int nexeccalls) {
729 for (; n > 0; n--) { 729 for (; n > 0; n--) {
730 TValue *val = ra+n; 730 TValue *val = ra+n;
731 setobj2t(L, luaH_setnum(L, h, last--), val); 731 setobj2t(L, luaH_setnum(L, h, last--), val);
732 luaC_barrier(L, h, val); 732 luaC_barriert(L, h, val);
733 } 733 }
734 continue; 734 continue;
735 } 735 }