aboutsummaryrefslogtreecommitdiff
path: root/lstate.c
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2004-08-30 10:44:44 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2004-08-30 10:44:44 -0300
commit0b062414831e3794fcdb747e53e9662d112473cf (patch)
tree002d75be5a52689a232e44787b2964d8c8e29b9c /lstate.c
parent857253cdfcddf4f49c7cec15791f948d1d7612bb (diff)
downloadlua-0b062414831e3794fcdb747e53e9662d112473cf.tar.gz
lua-0b062414831e3794fcdb747e53e9662d112473cf.tar.bz2
lua-0b062414831e3794fcdb747e53e9662d112473cf.zip
better control for GC cycles
Diffstat (limited to 'lstate.c')
-rw-r--r--lstate.c14
1 files changed, 8 insertions, 6 deletions
diff --git a/lstate.c b/lstate.c
index 11f57728..568d8e72 100644
--- a/lstate.c
+++ b/lstate.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lstate.c,v 2.10 2004/06/17 14:25:31 roberto Exp roberto $ 2** $Id: lstate.c,v 2.11 2004/08/24 20:12:06 roberto Exp roberto $
3** Global State 3** Global State
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -77,11 +77,12 @@ static void freestack (lua_State *L, lua_State *L1) {
77*/ 77*/
78static void f_luaopen (lua_State *L, void *ud) { 78static void f_luaopen (lua_State *L, void *ud) {
79 Udata *u; /* head of udata list */ 79 Udata *u; /* head of udata list */
80 global_State *g = G(L);
80 UNUSED(ud); 81 UNUSED(ud);
81 u = cast(Udata *, luaM_malloc(L, sizeudata(0))); 82 u = cast(Udata *, luaM_malloc(L, sizeudata(0)));
82 u->uv.len = 0; 83 u->uv.len = 0;
83 u->uv.metatable = NULL; 84 u->uv.metatable = NULL;
84 G(L)->firstudata = obj2gco(u); 85 g->firstudata = obj2gco(u);
85 luaC_link(L, obj2gco(u), LUA_TUSERDATA); 86 luaC_link(L, obj2gco(u), LUA_TUSERDATA);
86 setbit(u->uv.marked, FIXEDBIT); 87 setbit(u->uv.marked, FIXEDBIT);
87 setbit(L->marked, FIXEDBIT); 88 setbit(L->marked, FIXEDBIT);
@@ -93,7 +94,8 @@ static void f_luaopen (lua_State *L, void *ud) {
93 luaT_init(L); 94 luaT_init(L);
94 luaX_init(L); 95 luaX_init(L);
95 luaS_fix(luaS_newliteral(L, MEMERRMSG)); 96 luaS_fix(luaS_newliteral(L, MEMERRMSG));
96 G(L)->GCthreshold = 4*G(L)->nblocks; 97 g->GCthreshold = 4*g->totalbytes;
98 g->prevestimate = g->estimate = g->totalbytes;
97} 99}
98 100
99 101
@@ -128,7 +130,7 @@ static void close_state (lua_State *L) {
128 luaM_freearray(L, G(L)->strt.hash, G(L)->strt.size, TString *); 130 luaM_freearray(L, G(L)->strt.hash, G(L)->strt.size, TString *);
129 luaZ_freebuffer(L, &g->buff); 131 luaZ_freebuffer(L, &g->buff);
130 freestack(L, L); 132 freestack(L, L);
131 lua_assert(g->nblocks == sizeof(LG)); 133 lua_assert(g->totalbytes == sizeof(LG));
132 (*g->realloc)(g->ud, fromstate(L), state_size(LG), 0); 134 (*g->realloc)(g->ud, fromstate(L), state_size(LG), 0);
133} 135}
134 136
@@ -177,7 +179,7 @@ LUA_API lua_State *lua_newstate (lua_Alloc f, void *ud) {
177 setnilvalue(registry(L)); 179 setnilvalue(registry(L));
178 luaZ_initbuffer(L, &g->buff); 180 luaZ_initbuffer(L, &g->buff);
179 g->panic = NULL; 181 g->panic = NULL;
180 g->gcstate = GCSfinalize; 182 g->gcstate = GCSpause;
181 g->gcgenerational = 0; 183 g->gcgenerational = 0;
182 g->rootgc = obj2gco(L); 184 g->rootgc = obj2gco(L);
183 g->sweepstrgc = 0; 185 g->sweepstrgc = 0;
@@ -190,7 +192,7 @@ LUA_API lua_State *lua_newstate (lua_Alloc f, void *ud) {
190 setnilvalue(gkey(g->dummynode)); 192 setnilvalue(gkey(g->dummynode));
191 setnilvalue(gval(g->dummynode)); 193 setnilvalue(gval(g->dummynode));
192 g->dummynode->next = NULL; 194 g->dummynode->next = NULL;
193 g->nblocks = sizeof(LG); 195 g->totalbytes = sizeof(LG);
194 if (luaD_rawrunprotected(L, f_luaopen, NULL) != 0) { 196 if (luaD_rawrunprotected(L, f_luaopen, NULL) != 0) {
195 /* memory allocation error: free partial state */ 197 /* memory allocation error: free partial state */
196 close_state(L); 198 close_state(L);