aboutsummaryrefslogtreecommitdiff
path: root/lapi.c
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2017-05-26 16:14:29 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2017-05-26 16:14:29 -0300
commit72d82a296c1430a1d2bb3fac8ed8cbfb97868707 (patch)
tree4ea80148c5f1bfd38f0e7ca1cb8ef82e00e7e19c /lapi.c
parent4804bbd9bbfb89deb8a6c7dc2bc65601a701222b (diff)
downloadlua-72d82a296c1430a1d2bb3fac8ed8cbfb97868707.tar.gz
lua-72d82a296c1430a1d2bb3fac8ed8cbfb97868707.tar.bz2
lua-72d82a296c1430a1d2bb3fac8ed8cbfb97868707.zip
revamping the incremental collector
Some simplifications (not counting bytes, couting only slots visited; no more 'gcfinnum'); more GC parameters; using vararg in 'lua_gc' to set parameters in different GC modes
Diffstat (limited to 'lapi.c')
-rw-r--r--lapi.c44
1 files changed, 24 insertions, 20 deletions
diff --git a/lapi.c b/lapi.c
index e7d59b45..0c109e1e 100644
--- a/lapi.c
+++ b/lapi.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lapi.c,v 2.266 2017/05/11 18:57:46 roberto Exp roberto $ 2** $Id: lapi.c,v 2.267 2017/05/18 12:34:58 roberto Exp roberto $
3** Lua API 3** Lua API
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -1046,17 +1046,12 @@ LUA_API int lua_status (lua_State *L) {
1046/* 1046/*
1047** Garbage-collection function 1047** Garbage-collection function
1048*/ 1048*/
1049 1049LUA_API int lua_gc (lua_State *L, int what, ...) {
1050#if !defined(LUA_GENMAJORMUL) 1050 va_list argp;
1051#define LUA_GENMAJORMUL 100
1052#define LUA_GENMINORMUL 5
1053#endif
1054
1055LUA_API int lua_gc (lua_State *L, int what, int data) {
1056 int res = 0; 1051 int res = 0;
1057 global_State *g; 1052 global_State *g = G(L);
1058 lua_lock(L); 1053 lua_lock(L);
1059 g = G(L); 1054 va_start(argp, what);
1060 switch (what) { 1055 switch (what) {
1061 case LUA_GCSTOP: { 1056 case LUA_GCSTOP: {
1062 g->gcrunning = 0; 1057 g->gcrunning = 0;
@@ -1081,11 +1076,12 @@ LUA_API int lua_gc (lua_State *L, int what, int data) {
1081 break; 1076 break;
1082 } 1077 }
1083 case LUA_GCSTEP: { 1078 case LUA_GCSTEP: {
1079 int data = va_arg(argp, int);
1084 l_mem debt = 1; /* =1 to signal that it did an actual step */ 1080 l_mem debt = 1; /* =1 to signal that it did an actual step */
1085 lu_byte oldrunning = g->gcrunning; 1081 lu_byte oldrunning = g->gcrunning;
1086 g->gcrunning = 1; /* allow GC to run */ 1082 g->gcrunning = 1; /* allow GC to run */
1087 if (data == 0) { 1083 if (data == 0) {
1088 luaE_setdebt(g, -GCSTEPSIZE); /* to do a "small" step */ 1084 luaE_setdebt(g, 0); /* do a basic step */
1089 luaC_step(L); 1085 luaC_step(L);
1090 } 1086 }
1091 else { /* add 'data' to total debt */ 1087 else { /* add 'data' to total debt */
@@ -1099,14 +1095,15 @@ LUA_API int lua_gc (lua_State *L, int what, int data) {
1099 break; 1095 break;
1100 } 1096 }
1101 case LUA_GCSETPAUSE: { 1097 case LUA_GCSETPAUSE: {
1102 res = g->gcpause; 1098 int data = va_arg(argp, int);
1103 g->gcpause = data; 1099 res = g->gcpause + 100;
1100 g->gcpause = (data >= 100) ? data - 100 : 0;
1104 break; 1101 break;
1105 } 1102 }
1106 case LUA_GCSETSTEPMUL: { 1103 case LUA_GCSETSTEPMUL: {
1107 res = g->gcstepmul; 1104 int data = va_arg(argp, int);
1108 if (data < 40) data = 40; /* avoid ridiculous low values (and 0) */ 1105 res = g->gcstepmul * 10;
1109 g->gcstepmul = data; 1106 g->gcstepmul = data / 10;
1110 break; 1107 break;
1111 } 1108 }
1112 case LUA_GCISRUNNING: { 1109 case LUA_GCISRUNNING: {
@@ -1114,19 +1111,26 @@ LUA_API int lua_gc (lua_State *L, int what, int data) {
1114 break; 1111 break;
1115 } 1112 }
1116 case LUA_GCGEN: { 1113 case LUA_GCGEN: {
1117 lu_byte aux = data & 0xff; 1114 int minormul = va_arg(argp, int);
1118 g->genminormul = (aux == 0) ? LUA_GENMINORMUL : aux; 1115 int majormul = va_arg(argp, int);
1119 aux = (data >> 8) & 0xff; 1116 g->genminormul = (minormul == 0) ? LUAI_GENMINORMUL : minormul;
1120 g->genmajormul = (aux == 0) ? LUA_GENMAJORMUL : aux; 1117 g->genmajormul = (majormul == 0) ? LUAI_GENMAJORMUL : majormul;
1121 luaC_changemode(L, KGC_GEN); 1118 luaC_changemode(L, KGC_GEN);
1122 break; 1119 break;
1123 } 1120 }
1124 case LUA_GCINC: { 1121 case LUA_GCINC: {
1122 int pause = va_arg(argp, int);
1123 int stepmul = va_arg(argp, int);
1124 int stepsize = va_arg(argp, int);
1125 g->gcpause = (pause == 0) ? LUAI_GCPAUSE : pause;
1126 g->gcstepmul = (stepmul == 0) ? LUAI_GCMUL : stepmul;
1127 g->gcstepsize = (stepsize == 0) ? LUAI_GCSTEPSIZE : stepsize;
1125 luaC_changemode(L, KGC_INC); 1128 luaC_changemode(L, KGC_INC);
1126 break; 1129 break;
1127 } 1130 }
1128 default: res = -1; /* invalid option */ 1131 default: res = -1; /* invalid option */
1129 } 1132 }
1133 va_end(argp);
1130 lua_unlock(L); 1134 lua_unlock(L);
1131 return res; 1135 return res;
1132} 1136}