aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2002-11-19 12:12:13 -0200
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2002-11-19 12:12:13 -0200
commitbe762f38bd8484514417c9d1feff8ce678e86ef9 (patch)
tree9a70eba521e2e5f505aacb4b5d07eb33c02e50be
parentc8a79057f723e1e77a85570893adde1d563e441f (diff)
downloadlua-be762f38bd8484514417c9d1feff8ce678e86ef9.tar.gz
lua-be762f38bd8484514417c9d1feff8ce678e86ef9.tar.bz2
lua-be762f38bd8484514417c9d1feff8ce678e86ef9.zip
better organization of "malloc responsabilities"
-rw-r--r--lstate.c119
1 files changed, 66 insertions, 53 deletions
diff --git a/lstate.c b/lstate.c
index 12a771e2..323e5562 100644
--- a/lstate.c
+++ b/lstate.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lstate.c,v 1.111 2002/11/14 16:15:53 roberto Exp roberto $ 2** $Id: lstate.c,v 1.112 2002/11/18 11:01:55 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*/
@@ -30,10 +30,18 @@ union UEXTRASPACE {L_Umaxalign a; LUA_USERSTATE b;};
30#endif 30#endif
31 31
32 32
33static void close_state (lua_State *L);
34 33
34/*
35** you can change this function through the official API:
36** call `lua_setpanicf'
37*/
38static int default_panic (lua_State *L) {
39 UNUSED(L);
40 return 0;
41}
35 42
36static lua_State *newthread (lua_State *L) { 43
44static lua_State *mallocstate (lua_State *L) {
37 lu_byte *block = (lu_byte *)luaM_malloc(L, sizeof(lua_State) + EXTRASPACE); 45 lu_byte *block = (lu_byte *)luaM_malloc(L, sizeof(lua_State) + EXTRASPACE);
38 if (block == NULL) return NULL; 46 if (block == NULL) return NULL;
39 else { 47 else {
@@ -43,13 +51,9 @@ static lua_State *newthread (lua_State *L) {
43} 51}
44 52
45 53
46/* 54static void freestate (lua_State *L, lua_State *L1) {
47** you can change this function through the official API: 55 luaM_free(L, cast(lu_byte *, L1) - EXTRASPACE,
48** call `lua_setpanicf' 56 sizeof(lua_State) + EXTRASPACE);
49*/
50static int default_panic (lua_State *L) {
51 UNUSED(L);
52 return 0;
53} 57}
54 58
55 59
@@ -69,29 +73,36 @@ static void stack_init (lua_State *L1, lua_State *L) {
69} 73}
70 74
71 75
76static void freestack (lua_State *L, lua_State *L1) {
77 luaM_freearray(L, L1->base_ci, L1->size_ci, CallInfo);
78 luaM_freearray(L, L1->stack, L1->stacksize, TObject);
79}
80
81
72/* 82/*
73** open parts that may cause memory-allocation errors 83** open parts that may cause memory-allocation errors
74*/ 84*/
75static void f_luaopen (lua_State *L, void *ud) { 85static void f_luaopen (lua_State *L, void *ud) {
76 UNUSED(ud);
77 /* create a new global state */ 86 /* create a new global state */
78 L->l_G = luaM_new(L, global_State); 87 global_State *g = luaM_new(L, global_State);
79 G(L)->mainthread = L; 88 UNUSED(ud);
80 G(L)->GCthreshold = 0; /* mark it as unfinished state */ 89 L->l_G = g;
81 G(L)->strt.size = 0; 90 g->mainthread = L;
82 G(L)->strt.nuse = 0; 91 g->GCthreshold = 0; /* mark it as unfinished state */
83 G(L)->strt.hash = NULL; 92 g->strt.size = 0;
93 g->strt.nuse = 0;
94 g->strt.hash = NULL;
84 setnilvalue(defaultmeta(L)); 95 setnilvalue(defaultmeta(L));
85 setnilvalue(registry(L)); 96 setnilvalue(registry(L));
86 luaZ_initbuffer(L, &G(L)->buff); 97 luaZ_initbuffer(L, &g->buff);
87 G(L)->panic = &default_panic; 98 g->panic = &default_panic;
88 G(L)->rootgc = NULL; 99 g->rootgc = NULL;
89 G(L)->rootudata = NULL; 100 g->rootudata = NULL;
90 G(L)->tmudata = NULL; 101 g->tmudata = NULL;
91 setnilvalue(key(G(L)->dummynode)); 102 setnilvalue(key(g->dummynode));
92 setnilvalue(val(G(L)->dummynode)); 103 setnilvalue(val(g->dummynode));
93 G(L)->dummynode->next = NULL; 104 g->dummynode->next = NULL;
94 G(L)->nblocks = sizeof(lua_State) + sizeof(global_State); 105 g->nblocks = sizeof(lua_State) + sizeof(global_State);
95 stack_init(L, L); /* init stack */ 106 stack_init(L, L); /* init stack */
96 /* create default meta table with a dummy table, and then close the loop */ 107 /* create default meta table with a dummy table, and then close the loop */
97 defaultmeta(L)->tt = LUA_TTABLE; 108 defaultmeta(L)->tt = LUA_TTABLE;
@@ -103,7 +114,7 @@ static void f_luaopen (lua_State *L, void *ud) {
103 luaT_init(L); 114 luaT_init(L);
104 luaX_init(L); 115 luaX_init(L);
105 luaS_fix(luaS_newliteral(L, MEMERRMSG)); 116 luaS_fix(luaS_newliteral(L, MEMERRMSG));
106 G(L)->GCthreshold = 4*G(L)->nblocks; 117 g->GCthreshold = 4*G(L)->nblocks;
107} 118}
108 119
109 120
@@ -124,8 +135,26 @@ static void preinit_state (lua_State *L) {
124} 135}
125 136
126 137
138static void close_state (lua_State *L) {
139 luaF_close(L, L->stack); /* close all upvalues for this thread */
140 if (G(L)) { /* close global state */
141 luaC_sweep(L, 1); /* collect all elements */
142 lua_assert(G(L)->rootgc == NULL);
143 lua_assert(G(L)->rootudata == NULL);
144 luaS_freeall(L);
145 luaZ_freebuffer(L, &G(L)->buff);
146 }
147 freestack(L, L);
148 if (G(L)) {
149 lua_assert(G(L)->nblocks == sizeof(lua_State) + sizeof(global_State));
150 luaM_freelem(L, G(L));
151 }
152 freestate(NULL, L);
153}
154
155
127lua_State *luaE_newthread (lua_State *L) { 156lua_State *luaE_newthread (lua_State *L) {
128 lua_State *L1 = newthread(L); 157 lua_State *L1 = mallocstate(L);
129 luaC_link(L, valtogco(L1), LUA_TTHREAD); 158 luaC_link(L, valtogco(L1), LUA_TTHREAD);
130 preinit_state(L1); 159 preinit_state(L1);
131 L1->l_G = L->l_G; 160 L1->l_G = L->l_G;
@@ -135,8 +164,16 @@ lua_State *luaE_newthread (lua_State *L) {
135} 164}
136 165
137 166
167void luaE_freethread (lua_State *L, lua_State *L1) {
168 luaF_close(L1, L1->stack); /* close all upvalues for this thread */
169 lua_assert(L1->openupval == NULL);
170 freestack(L, L1);
171 freestate(L, L1);
172}
173
174
138LUA_API lua_State *lua_open (void) { 175LUA_API lua_State *lua_open (void) {
139 lua_State *L = newthread(NULL); 176 lua_State *L = mallocstate(NULL);
140 if (L) { /* allocation OK? */ 177 if (L) { /* allocation OK? */
141 L->tt = LUA_TTHREAD; 178 L->tt = LUA_TTHREAD;
142 preinit_state(L); 179 preinit_state(L);
@@ -152,30 +189,6 @@ LUA_API lua_State *lua_open (void) {
152} 189}
153 190
154 191
155void luaE_freethread (lua_State *L, lua_State *L1) {
156 luaF_close(L1, L1->stack); /* close all upvalues for this thread */
157 lua_assert(L1->openupval == NULL);
158 luaM_freearray(L, L1->base_ci, L1->size_ci, CallInfo);
159 luaM_freearray(L, L1->stack, L1->stacksize, TObject);
160 luaM_free(L, cast(lu_byte *, L1) - EXTRASPACE,
161 sizeof(lua_State) + EXTRASPACE);
162}
163
164
165static void close_state (lua_State *L) {
166 luaF_close(L, L->stack); /* close all upvalues for this thread */
167 if (G(L)) { /* close global state */
168 luaC_sweep(L, 1); /* collect all elements */
169 lua_assert(G(L)->rootgc == NULL);
170 lua_assert(G(L)->rootudata == NULL);
171 luaS_freeall(L);
172 luaZ_freebuffer(L, &G(L)->buff);
173 luaM_freelem(NULL, L->l_G);
174 }
175 luaE_freethread(NULL, L);
176}
177
178
179LUA_API void lua_close (lua_State *L) { 192LUA_API void lua_close (lua_State *L) {
180 lua_lock(L); 193 lua_lock(L);
181 L = G(L)->mainthread; /* only the main thread can be closed */ 194 L = G(L)->mainthread; /* only the main thread can be closed */