summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2022-11-01 17:14:01 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2022-11-01 17:14:01 -0300
commit9ede317c70ad82279f2e3962eb52904a17bf4b55 (patch)
treee2d60bac0e987fe2cb6da54222765a90414f3d2a
parentee645472ebe153e2c6669c84a632297a8110bdb6 (diff)
downloadlua-github-9ede317c70ad82279f2e3962eb52904a17bf4b55.tar.gz
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.c14
-rw-r--r--lgc.h2
-rw-r--r--lstate.c12
3 files changed, 16 insertions, 12 deletions
diff --git a/lgc.c b/lgc.c
index 8e76ccd7..2e749902 100644
--- a/lgc.c
+++ b/lgc.c
@@ -252,12 +252,13 @@ void luaC_fix (lua_State *L, GCObject *o) {
/*
-** create a new collectable object (with given type and size) and link
-** it to 'allgc' list.
+** create a new collectable object (with given type, size, and offset)
+** and link it to 'allgc' list.
*/
-GCObject *luaC_newobj (lua_State *L, int tt, size_t sz) {
+GCObject *luaC_newobjdt (lua_State *L, int tt, size_t sz, size_t offset) {
global_State *g = G(L);
- GCObject *o = cast(GCObject *, luaM_newobject(L, novariant(tt), sz));
+ char *p = cast_charp(luaM_newobject(L, novariant(tt), sz));
+ GCObject *o = cast(GCObject *, p + offset);
o->marked = luaC_white(g);
o->tt = tt;
o->next = g->allgc;
@@ -265,6 +266,11 @@ GCObject *luaC_newobj (lua_State *L, int tt, size_t sz) {
return o;
}
+
+GCObject *luaC_newobj (lua_State *L, int tt, size_t sz) {
+ return luaC_newobjdt(L, tt, sz, 0);
+}
+
/* }====================================================== */
diff --git a/lgc.h b/lgc.h
index 4a125634..c960e706 100644
--- a/lgc.h
+++ b/lgc.h
@@ -190,6 +190,8 @@ LUAI_FUNC void luaC_step (lua_State *L);
LUAI_FUNC void luaC_runtilstate (lua_State *L, int statesmask);
LUAI_FUNC void luaC_fullgc (lua_State *L, int isemergency);
LUAI_FUNC GCObject *luaC_newobj (lua_State *L, int tt, size_t sz);
+LUAI_FUNC GCObject *luaC_newobjdt (lua_State *L, int tt, size_t sz,
+ size_t offset);
LUAI_FUNC void luaC_barrier_ (lua_State *L, GCObject *o, GCObject *v);
LUAI_FUNC void luaC_barrierback_ (lua_State *L, GCObject *o);
LUAI_FUNC void luaC_checkfinalizer (lua_State *L, GCObject *o, Table *mt);
diff --git a/lstate.c b/lstate.c
index c63fe867..1fbefb4b 100644
--- a/lstate.c
+++ b/lstate.c
@@ -284,18 +284,14 @@ static void close_state (lua_State *L) {
LUA_API lua_State *lua_newthread (lua_State *L) {
- global_State *g;
+ global_State *g = G(L);
+ GCObject *o;
lua_State *L1;
lua_lock(L);
- g = G(L);
luaC_checkGC(L);
/* create new thread */
- L1 = &cast(LX *, luaM_newobject(L, LUA_TTHREAD, sizeof(LX)))->l;
- L1->marked = luaC_white(g);
- L1->tt = LUA_VTHREAD;
- /* link it on list 'allgc' */
- L1->next = g->allgc;
- g->allgc = obj2gco(L1);
+ o = luaC_newobjdt(L, LUA_TTHREAD, sizeof(LX), offsetof(LX, l));
+ L1 = gco2th(o);
/* anchor it on L stack */
setthvalue2s(L, L->top.p, L1);
api_incr_top(L);