aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2023-12-01 16:38:28 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2023-12-01 16:38:28 -0300
commitb719ff9399cbc4b19b2b8325417fc5fa0ef3d0e3 (patch)
tree99d83abfb2da27d30498f87b9e6b159e73d99812
parent35a2fed2d1e0b95a1bfab364707e469863517085 (diff)
downloadlua-b719ff9399cbc4b19b2b8325417fc5fa0ef3d0e3.tar.gz
lua-b719ff9399cbc4b19b2b8325417fc5fa0ef3d0e3.tar.bz2
lua-b719ff9399cbc4b19b2b8325417fc5fa0ef3d0e3.zip
Removed parameter in 'collectgarbage("step")'
A call to 'collectgarbage("step")' always performs one GC basic step.
Diffstat (limited to '')
-rw-r--r--lapi.c18
-rw-r--r--testes/gc.lua42
2 files changed, 3 insertions, 57 deletions
diff --git a/lapi.c b/lapi.c
index 93695144..f807bd4b 100644
--- a/lapi.c
+++ b/lapi.c
@@ -1191,25 +1191,11 @@ LUA_API int lua_gc (lua_State *L, int what, ...) {
1191 break; 1191 break;
1192 } 1192 }
1193 case LUA_GCSTEP: { 1193 case LUA_GCSTEP: {
1194 int todo = va_arg(argp, int); /* work to be done */
1195 int didsomething = 0;
1196 lu_byte oldstp = g->gcstp; 1194 lu_byte oldstp = g->gcstp;
1197 g->gcstp = 0; /* allow GC to run (other bits must be zero here) */ 1195 g->gcstp = 0; /* allow GC to run (other bits must be zero here) */
1198 if (todo == 0) 1196 luaC_step(L); /* run one basic step */
1199 todo = 1 << g->gcstepsize; /* standard step size */
1200 while (todo >= g->GCdebt) { /* enough to run a step? */
1201 todo -= g->GCdebt; /* decrement 'todo' */
1202 luaC_step(L); /* run one basic step */
1203 didsomething = 1;
1204 if (g->gckind == KGC_GEN) /* minor collections? */
1205 todo = 0; /* doesn't make sense to repeat in this case */
1206 else if (g->gcstate == GCSpause)
1207 break; /* don't run more than one cycle */
1208 }
1209 /* remove remaining 'todo' from total debt */
1210 luaE_setdebt(g, g->GCdebt - todo);
1211 g->gcstp = oldstp; /* restore previous state */ 1197 g->gcstp = oldstp; /* restore previous state */
1212 if (didsomething && g->gcstate == GCSpause) /* end of cycle? */ 1198 if (g->gcstate == GCSpause) /* end of cycle? */
1213 res = 1; /* signal it */ 1199 res = 1; /* signal it */
1214 break; 1200 break;
1215 } 1201 }
diff --git a/testes/gc.lua b/testes/gc.lua
index 4cf7d556..d7e0c4ff 100644
--- a/testes/gc.lua
+++ b/testes/gc.lua
@@ -33,8 +33,7 @@ do
33 for j = 1, #t do 33 for j = 1, #t do
34 local m = t[j] 34 local m = t[j]
35 collectgarbage("incremental", p, m) 35 collectgarbage("incremental", p, m)
36 collectgarbage("step", 0) 36 collectgarbage("step")
37 collectgarbage("step", 10000)
38 end 37 end
39 end 38 end
40 -- restore original parameters 39 -- restore original parameters
@@ -169,45 +168,6 @@ do
169end 168end
170 169
171 170
172--
173-- test the "size" of basic GC steps (whatever they mean...)
174--
175do
176print("steps")
177
178 print("steps (2)")
179
180 local function dosteps (siz)
181 collectgarbage()
182 local a = {}
183 for i=1,100 do a[i] = {{}}; local b = {} end
184 local x = gcinfo()
185 local i = 0
186 repeat -- do steps until it completes a collection cycle
187 i = i+1
188 until collectgarbage("step", siz)
189 assert(gcinfo() < x)
190 return i -- number of steps
191 end
192
193 collectgarbage"stop"
194
195 if not _port then
196 assert(dosteps(10) < dosteps(2))
197 end
198
199 -- collector should do a full collection with so many steps
200 assert(dosteps(20000) == 1)
201 assert(collectgarbage("step", 20000) == true)
202 assert(collectgarbage("step", 20000) == true)
203
204 assert(not collectgarbage("isrunning"))
205 collectgarbage"restart"
206 assert(collectgarbage("isrunning"))
207
208end
209
210
211if not _port then 171if not _port then
212 -- test the pace of the collector 172 -- test the pace of the collector
213 collectgarbage(); collectgarbage() 173 collectgarbage(); collectgarbage()