aboutsummaryrefslogtreecommitdiff
path: root/lapi.c
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2023-12-22 14:48:07 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2023-12-22 14:48:07 -0300
commite2cc179454c6aa6cde5f98954bd3783e0d5d53a3 (patch)
tree1770fb2eded15ad53211693b19eb2a8698cbf192 /lapi.c
parentad0ea7813b39e76b377983138ca995189e22054f (diff)
downloadlua-e2cc179454c6aa6cde5f98954bd3783e0d5d53a3.tar.gz
lua-e2cc179454c6aa6cde5f98954bd3783e0d5d53a3.tar.bz2
lua-e2cc179454c6aa6cde5f98954bd3783e0d5d53a3.zip
New option "setparms" for 'collectgarbage'
The generational mode also uses the parameters for the incremental mode in its major collections, so it should be easy to change those parameters without having to change the GC mode.
Diffstat (limited to 'lapi.c')
-rw-r--r--lapi.c24
1 files changed, 17 insertions, 7 deletions
diff --git a/lapi.c b/lapi.c
index 3ea3d0aa..aa2ee735 100644
--- a/lapi.c
+++ b/lapi.c
@@ -1186,27 +1186,37 @@ LUA_API int lua_gc (lua_State *L, int what, ...) {
1186 break; 1186 break;
1187 } 1187 }
1188 case LUA_GCGEN: { 1188 case LUA_GCGEN: {
1189#if defined(LUA_COMPAT_GCPARAMS)
1189 int minormul = va_arg(argp, int); 1190 int minormul = va_arg(argp, int);
1190 int minormajor = va_arg(argp, int); 1191 int minormajor = va_arg(argp, int);
1191 int majorminor = va_arg(argp, int); 1192 if (minormul > 0) setgcparam(g, MINORMUL, minormul);
1193 if (minormajor > 0) setgcparam(g, MINORMAJOR, minormajor);
1194#endif
1192 res = (g->gckind == KGC_INC) ? LUA_GCINC : LUA_GCGEN; 1195 res = (g->gckind == KGC_INC) ? LUA_GCINC : LUA_GCGEN;
1193 setgcparam(g, gcpgenminormul, minormul);
1194 setgcparam(g, gcpminormajor, minormajor);
1195 setgcparam(g, gcpmajorminor, majorminor);
1196 luaC_changemode(L, KGC_GENMINOR); 1196 luaC_changemode(L, KGC_GENMINOR);
1197 break; 1197 break;
1198 } 1198 }
1199 case LUA_GCINC: { 1199 case LUA_GCINC: {
1200#if defined(LUA_COMPAT_GCPARAMS)
1200 int pause = va_arg(argp, int); 1201 int pause = va_arg(argp, int);
1201 int stepmul = va_arg(argp, int); 1202 int stepmul = va_arg(argp, int);
1202 int stepsize = va_arg(argp, int); 1203 int stepsize = va_arg(argp, int);
1204 if (pause > 0) setgcparam(g, PAUSE, pause);
1205 if (stepmul > 0) setgcparam(g, STEPMUL, stepmul);
1206 if (stepsize > 0) setgcparam(g, STEPSIZE, 1u << stepsize);
1207#endif
1203 res = (g->gckind == KGC_INC) ? LUA_GCINC : LUA_GCGEN; 1208 res = (g->gckind == KGC_INC) ? LUA_GCINC : LUA_GCGEN;
1204 setgcparam(g, gcppause, pause);
1205 setgcparam(g, gcpstepmul, stepmul);
1206 setgcparam(g, gcpstepsize, stepsize);
1207 luaC_changemode(L, KGC_INC); 1209 luaC_changemode(L, KGC_INC);
1208 break; 1210 break;
1209 } 1211 }
1212 case LUA_GCSETPARAM: {
1213 int param = va_arg(argp, int);
1214 int value = va_arg(argp, int);
1215 api_check(L, 0 <= param && param < LUA_GCPN, "invalid parameter");
1216 res = luaO_applyparam(g->gcparams[param], 100);
1217 g->gcparams[param] = luaO_codeparam(value);
1218 break;
1219 }
1210 default: res = -1; /* invalid option */ 1220 default: res = -1; /* invalid option */
1211 } 1221 }
1212 va_end(argp); 1222 va_end(argp);