aboutsummaryrefslogtreecommitdiff
path: root/lstate.c
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2013-09-11 11:09:55 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2013-09-11 11:09:55 -0300
commitdd373a8f665e5e22ad3ad75401aa9fe3bbb2afc8 (patch)
treed475246f43edc6de6e1ebf491b274e9d9a5c1c24 /lstate.c
parent7061fe1d56f40e9d22a226423079da808fb41f66 (diff)
downloadlua-dd373a8f665e5e22ad3ad75401aa9fe3bbb2afc8.tar.gz
lua-dd373a8f665e5e22ad3ad75401aa9fe3bbb2afc8.tar.bz2
lua-dd373a8f665e5e22ad3ad75401aa9fe3bbb2afc8.zip
threads are kept in a separated GC list, linked after the main thread
Diffstat (limited to 'lstate.c')
-rw-r--r--lstate.c20
1 files changed, 6 insertions, 14 deletions
diff --git a/lstate.c b/lstate.c
index 414e27d2..f9d857fb 100644
--- a/lstate.c
+++ b/lstate.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lstate.c,v 2.111 2013/09/05 19:31:49 roberto Exp roberto $ 2** $Id: lstate.c,v 2.112 2013/09/11 12:26:14 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*/
@@ -165,14 +165,6 @@ static void init_registry (lua_State *L, global_State *g) {
165 sethvalue(L, &g->l_registry, registry); 165 sethvalue(L, &g->l_registry, registry);
166 luaH_resize(L, registry, LUA_RIDX_LAST, 0); 166 luaH_resize(L, registry, LUA_RIDX_LAST, 0);
167 nolocal(obj2gco(registry)); 167 nolocal(obj2gco(registry));
168 /* registry is the first "regular" object created by a state; move it
169 from 'localgc' to 'allgc' so that it act as a "sentinel" there */
170 lua_assert(g->allgc == NULL &&
171 registry->next == NULL &&
172 g->localgc == obj2gco(registry));
173 g->allgc = g->localgc;
174 g->localgc = NULL;
175 l_setbit(registry->marked, LOCALMARK); /* mark that it is not in 'localgc' */
176 /* registry[LUA_RIDX_MAINTHREAD] = L */ 168 /* registry[LUA_RIDX_MAINTHREAD] = L */
177 setthvalue(L, &temp, L); /* temp = L */ 169 setthvalue(L, &temp, L); /* temp = L */
178 luaH_setint(L, registry, LUA_RIDX_MAINTHREAD, &temp); 170 luaH_setint(L, registry, LUA_RIDX_MAINTHREAD, &temp);
@@ -243,11 +235,11 @@ LUA_API lua_State *lua_newthread (lua_State *L) {
243 luaC_checkGC(L); 235 luaC_checkGC(L);
244 /* create new thread */ 236 /* create new thread */
245 L1 = &cast(LX *, luaM_newobject(L, LUA_TTHREAD, sizeof(LX)))->l; 237 L1 = &cast(LX *, luaM_newobject(L, LUA_TTHREAD, sizeof(LX)))->l;
246 L1->marked = luaC_white(g) | bitmask(LOCALMARK) | bitmask(NOLOCALBIT); 238 L1->marked = luaC_white(g) | bit2mask(NOLOCALBIT, LOCALMARK);
247 L1->tt = LUA_TTHREAD; 239 L1->tt = LUA_TTHREAD;
248 /* link it after 'l_registry' */ 240 /* link it on list of threads */
249 L1->next = hvalue(&g->l_registry)->next; 241 L1->next = g->mainthread->next;
250 hvalue(&g->l_registry)->next = obj2gco(L1); 242 g->mainthread->next = obj2gco(L1);
251 setthvalue(L, L->top, L1); 243 setthvalue(L, L->top, L1);
252 api_incr_top(L); 244 api_incr_top(L);
253 preinit_state(L1, g); 245 preinit_state(L1, g);
@@ -283,7 +275,7 @@ LUA_API lua_State *lua_newstate (lua_Alloc f, void *ud) {
283 L->next = NULL; 275 L->next = NULL;
284 L->tt = LUA_TTHREAD; 276 L->tt = LUA_TTHREAD;
285 g->currentwhite = bitmask(WHITE0BIT); 277 g->currentwhite = bitmask(WHITE0BIT);
286 L->marked = luaC_white(g) | bitmask(NOLOCALBIT); 278 L->marked = luaC_white(g) | bit2mask(NOLOCALBIT, LOCALMARK);
287 g->gckind = KGC_NORMAL; 279 g->gckind = KGC_NORMAL;
288 preinit_state(L, g); 280 preinit_state(L, g);
289 g->frealloc = f; 281 g->frealloc = f;