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