mirror of https://github.com/rusefi/lua.git
Threads are created like other objects
Using a version of 'luaC_newobj' that allows offsets (extra space before the object itself).
This commit is contained in:
parent
ee645472eb
commit
9ede317c70
14
lgc.c
14
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
|
** create a new collectable object (with given type, size, and offset)
|
||||||
** it to 'allgc' list.
|
** 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);
|
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->marked = luaC_white(g);
|
||||||
o->tt = tt;
|
o->tt = tt;
|
||||||
o->next = g->allgc;
|
o->next = g->allgc;
|
||||||
|
@ -265,6 +266,11 @@ GCObject *luaC_newobj (lua_State *L, int tt, size_t sz) {
|
||||||
return o;
|
return o;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
GCObject *luaC_newobj (lua_State *L, int tt, size_t sz) {
|
||||||
|
return luaC_newobjdt(L, tt, sz, 0);
|
||||||
|
}
|
||||||
|
|
||||||
/* }====================================================== */
|
/* }====================================================== */
|
||||||
|
|
||||||
|
|
||||||
|
|
2
lgc.h
2
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_runtilstate (lua_State *L, int statesmask);
|
||||||
LUAI_FUNC void luaC_fullgc (lua_State *L, int isemergency);
|
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_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_barrier_ (lua_State *L, GCObject *o, GCObject *v);
|
||||||
LUAI_FUNC void luaC_barrierback_ (lua_State *L, GCObject *o);
|
LUAI_FUNC void luaC_barrierback_ (lua_State *L, GCObject *o);
|
||||||
LUAI_FUNC void luaC_checkfinalizer (lua_State *L, GCObject *o, Table *mt);
|
LUAI_FUNC void luaC_checkfinalizer (lua_State *L, GCObject *o, Table *mt);
|
||||||
|
|
12
lstate.c
12
lstate.c
|
@ -284,18 +284,14 @@ static void close_state (lua_State *L) {
|
||||||
|
|
||||||
|
|
||||||
LUA_API lua_State *lua_newthread (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_State *L1;
|
||||||
lua_lock(L);
|
lua_lock(L);
|
||||||
g = G(L);
|
|
||||||
luaC_checkGC(L);
|
luaC_checkGC(L);
|
||||||
/* create new thread */
|
/* create new thread */
|
||||||
L1 = &cast(LX *, luaM_newobject(L, LUA_TTHREAD, sizeof(LX)))->l;
|
o = luaC_newobjdt(L, LUA_TTHREAD, sizeof(LX), offsetof(LX, l));
|
||||||
L1->marked = luaC_white(g);
|
L1 = gco2th(o);
|
||||||
L1->tt = LUA_VTHREAD;
|
|
||||||
/* link it on list 'allgc' */
|
|
||||||
L1->next = g->allgc;
|
|
||||||
g->allgc = obj2gco(L1);
|
|
||||||
/* anchor it on L stack */
|
/* anchor it on L stack */
|
||||||
setthvalue2s(L, L->top.p, L1);
|
setthvalue2s(L, L->top.p, L1);
|
||||||
api_incr_top(L);
|
api_incr_top(L);
|
||||||
|
|
Loading…
Reference in New Issue