diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2022-11-01 17:14:01 -0300 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2022-11-01 17:14:01 -0300 |
commit | 9ede317c70ad82279f2e3962eb52904a17bf4b55 (patch) | |
tree | e2d60bac0e987fe2cb6da54222765a90414f3d2a | |
parent | ee645472ebe153e2c6669c84a632297a8110bdb6 (diff) | |
download | lua-9ede317c70ad82279f2e3962eb52904a17bf4b55.tar.gz lua-9ede317c70ad82279f2e3962eb52904a17bf4b55.tar.bz2 lua-9ede317c70ad82279f2e3962eb52904a17bf4b55.zip |
Threads are created like other objects
Using a version of 'luaC_newobj' that allows offsets (extra space
before the object itself).
-rw-r--r-- | lgc.c | 14 | ||||
-rw-r--r-- | lgc.h | 2 | ||||
-rw-r--r-- | lstate.c | 12 |
3 files changed, 16 insertions, 12 deletions
@@ -252,12 +252,13 @@ void luaC_fix (lua_State *L, GCObject *o) { | |||
252 | 252 | ||
253 | 253 | ||
254 | /* | 254 | /* |
255 | ** create a new collectable object (with given type and size) and link | 255 | ** create a new collectable object (with given type, size, and offset) |
256 | ** it to 'allgc' list. | 256 | ** and link it to 'allgc' list. |
257 | */ | 257 | */ |
258 | GCObject *luaC_newobj (lua_State *L, int tt, size_t sz) { | 258 | GCObject *luaC_newobjdt (lua_State *L, int tt, size_t sz, size_t offset) { |
259 | global_State *g = G(L); | 259 | global_State *g = G(L); |
260 | GCObject *o = cast(GCObject *, luaM_newobject(L, novariant(tt), sz)); | 260 | char *p = cast_charp(luaM_newobject(L, novariant(tt), sz)); |
261 | GCObject *o = cast(GCObject *, p + offset); | ||
261 | o->marked = luaC_white(g); | 262 | o->marked = luaC_white(g); |
262 | o->tt = tt; | 263 | o->tt = tt; |
263 | o->next = g->allgc; | 264 | o->next = g->allgc; |
@@ -265,6 +266,11 @@ GCObject *luaC_newobj (lua_State *L, int tt, size_t sz) { | |||
265 | return o; | 266 | return o; |
266 | } | 267 | } |
267 | 268 | ||
269 | |||
270 | GCObject *luaC_newobj (lua_State *L, int tt, size_t sz) { | ||
271 | return luaC_newobjdt(L, tt, sz, 0); | ||
272 | } | ||
273 | |||
268 | /* }====================================================== */ | 274 | /* }====================================================== */ |
269 | 275 | ||
270 | 276 | ||
@@ -190,6 +190,8 @@ LUAI_FUNC void luaC_step (lua_State *L); | |||
190 | LUAI_FUNC void luaC_runtilstate (lua_State *L, int statesmask); | 190 | LUAI_FUNC void luaC_runtilstate (lua_State *L, int statesmask); |
191 | LUAI_FUNC void luaC_fullgc (lua_State *L, int isemergency); | 191 | LUAI_FUNC void luaC_fullgc (lua_State *L, int isemergency); |
192 | LUAI_FUNC GCObject *luaC_newobj (lua_State *L, int tt, size_t sz); | 192 | LUAI_FUNC GCObject *luaC_newobj (lua_State *L, int tt, size_t sz); |
193 | LUAI_FUNC GCObject *luaC_newobjdt (lua_State *L, int tt, size_t sz, | ||
194 | size_t offset); | ||
193 | LUAI_FUNC void luaC_barrier_ (lua_State *L, GCObject *o, GCObject *v); | 195 | LUAI_FUNC void luaC_barrier_ (lua_State *L, GCObject *o, GCObject *v); |
194 | LUAI_FUNC void luaC_barrierback_ (lua_State *L, GCObject *o); | 196 | LUAI_FUNC void luaC_barrierback_ (lua_State *L, GCObject *o); |
195 | LUAI_FUNC void luaC_checkfinalizer (lua_State *L, GCObject *o, Table *mt); | 197 | LUAI_FUNC void luaC_checkfinalizer (lua_State *L, GCObject *o, Table *mt); |
@@ -284,18 +284,14 @@ static void close_state (lua_State *L) { | |||
284 | 284 | ||
285 | 285 | ||
286 | LUA_API lua_State *lua_newthread (lua_State *L) { | 286 | LUA_API lua_State *lua_newthread (lua_State *L) { |
287 | global_State *g; | 287 | global_State *g = G(L); |
288 | GCObject *o; | ||
288 | lua_State *L1; | 289 | lua_State *L1; |
289 | lua_lock(L); | 290 | lua_lock(L); |
290 | g = G(L); | ||
291 | luaC_checkGC(L); | 291 | luaC_checkGC(L); |
292 | /* create new thread */ | 292 | /* create new thread */ |
293 | L1 = &cast(LX *, luaM_newobject(L, LUA_TTHREAD, sizeof(LX)))->l; | 293 | o = luaC_newobjdt(L, LUA_TTHREAD, sizeof(LX), offsetof(LX, l)); |
294 | L1->marked = luaC_white(g); | 294 | L1 = gco2th(o); |
295 | L1->tt = LUA_VTHREAD; | ||
296 | /* link it on list 'allgc' */ | ||
297 | L1->next = g->allgc; | ||
298 | g->allgc = obj2gco(L1); | ||
299 | /* anchor it on L stack */ | 295 | /* anchor it on L stack */ |
300 | setthvalue2s(L, L->top.p, L1); | 296 | setthvalue2s(L, L->top.p, L1); |
301 | api_incr_top(L); | 297 | api_incr_top(L); |