diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2023-12-22 14:48:07 -0300 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2023-12-22 14:48:07 -0300 |
commit | e2cc179454c6aa6cde5f98954bd3783e0d5d53a3 (patch) | |
tree | 1770fb2eded15ad53211693b19eb2a8698cbf192 /lapi.c | |
parent | ad0ea7813b39e76b377983138ca995189e22054f (diff) | |
download | lua-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.c | 24 |
1 files changed, 17 insertions, 7 deletions
@@ -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); |