diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2004-08-30 10:44:44 -0300 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2004-08-30 10:44:44 -0300 |
commit | 0b062414831e3794fcdb747e53e9662d112473cf (patch) | |
tree | 002d75be5a52689a232e44787b2964d8c8e29b9c /lstate.c | |
parent | 857253cdfcddf4f49c7cec15791f948d1d7612bb (diff) | |
download | lua-0b062414831e3794fcdb747e53e9662d112473cf.tar.gz lua-0b062414831e3794fcdb747e53e9662d112473cf.tar.bz2 lua-0b062414831e3794fcdb747e53e9662d112473cf.zip |
better control for GC cycles
Diffstat (limited to 'lstate.c')
-rw-r--r-- | lstate.c | 14 |
1 files changed, 8 insertions, 6 deletions
@@ -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 | */ |
78 | static void f_luaopen (lua_State *L, void *ud) { | 78 | static 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); |