| 1016 | */ |
| 1017 | |
| 1018 | LUA_API int lua_gc (lua_State *L, int what, int data) { |
| 1019 | int res = 0; |
| 1020 | global_State *g; |
| 1021 | lua_lock(L); |
| 1022 | g = G(L); |
| 1023 | switch (what) { |
| 1024 | case LUA_GCSTOP: { |
| 1025 | g->gcrunning = 0; |
| 1026 | break; |
| 1027 | } |
| 1028 | case LUA_GCRESTART: { |
| 1029 | luaE_setdebt(g, 0); |
| 1030 | g->gcrunning = 1; |
| 1031 | break; |
| 1032 | } |
| 1033 | case LUA_GCCOLLECT: { |
| 1034 | luaC_fullgc(L, 0); |
| 1035 | break; |
| 1036 | } |
| 1037 | case LUA_GCCOUNT: { |
| 1038 | /* GC values are expressed in Kbytes: #bytes/2^10 */ |
| 1039 | res = cast_int(gettotalbytes(g) >> 10); |
| 1040 | break; |
| 1041 | } |
| 1042 | case LUA_GCCOUNTB: { |
| 1043 | res = cast_int(gettotalbytes(g) & 0x3ff); |
| 1044 | break; |
| 1045 | } |
| 1046 | case LUA_GCSTEP: { |
| 1047 | if (g->gckind == KGC_GEN) { /* generational mode? */ |
| 1048 | res = (g->GCestimate == 0); /* true if it will do major collection */ |
| 1049 | luaC_forcestep(L); /* do a single step */ |
| 1050 | } |
| 1051 | else { |
| 1052 | lu_mem debt = cast(lu_mem, data) * 1024 - GCSTEPSIZE; |
| 1053 | if (g->gcrunning) |
| 1054 | debt += g->GCdebt; /* include current debt */ |
| 1055 | luaE_setdebt(g, debt); |
| 1056 | luaC_forcestep(L); |
| 1057 | if (g->gcstate == GCSpause) /* end of cycle? */ |
| 1058 | res = 1; /* signal it */ |
| 1059 | } |
| 1060 | break; |
| 1061 | } |
| 1062 | case LUA_GCSETPAUSE: { |
| 1063 | res = g->gcpause; |
| 1064 | g->gcpause = data; |
| 1065 | break; |
| 1066 | } |
| 1067 | case LUA_GCSETMAJORINC: { |
| 1068 | res = g->gcmajorinc; |
| 1069 | g->gcmajorinc = data; |
| 1070 | break; |
| 1071 | } |
| 1072 | case LUA_GCSETSTEPMUL: { |
| 1073 | res = g->gcstepmul; |
| 1074 | g->gcstepmul = data; |
| 1075 | break; |
no test coverage detected