| 933 | */ |
| 934 | |
| 935 | LUA_API int lua_gc (lua_State *L, int what, int data) { |
| 936 | int res = 0; |
| 937 | global_State *g; |
| 938 | lua_lock(L); |
| 939 | g = G(L); |
| 940 | switch (what) { |
| 941 | case LUA_GCSTOP: { |
| 942 | g->GCthreshold = MAX_LUMEM; |
| 943 | break; |
| 944 | } |
| 945 | case LUA_GCRESTART: { |
| 946 | g->GCthreshold = g->totalbytes; |
| 947 | break; |
| 948 | } |
| 949 | case LUA_GCCOLLECT: { |
| 950 | luaC_fullgc(L); |
| 951 | break; |
| 952 | } |
| 953 | case LUA_GCCOUNT: { |
| 954 | /* GC values are expressed in Kbytes: #bytes/2^10 */ |
| 955 | res = cast_int(g->totalbytes >> 10); |
| 956 | break; |
| 957 | } |
| 958 | case LUA_GCCOUNTB: { |
| 959 | res = cast_int(g->totalbytes & 0x3ff); |
| 960 | break; |
| 961 | } |
| 962 | case LUA_GCSTEP: { |
| 963 | lu_mem a = (cast(lu_mem, data) << 10); |
| 964 | if (a <= g->totalbytes) |
| 965 | g->GCthreshold = g->totalbytes - a; |
| 966 | else |
| 967 | g->GCthreshold = 0; |
| 968 | while (g->GCthreshold <= g->totalbytes) { |
| 969 | luaC_step(L); |
| 970 | if (g->gcstate == GCSpause) { /* end of cycle? */ |
| 971 | res = 1; /* signal it */ |
| 972 | break; |
| 973 | } |
| 974 | } |
| 975 | break; |
| 976 | } |
| 977 | case LUA_GCSETPAUSE: { |
| 978 | res = g->gcpause; |
| 979 | g->gcpause = data; |
| 980 | break; |
| 981 | } |
| 982 | case LUA_GCSETSTEPMUL: { |
| 983 | res = g->gcstepmul; |
| 984 | g->gcstepmul = data; |
| 985 | break; |
| 986 | } |
| 987 | default: res = -1; /* invalid option */ |
| 988 | } |
| 989 | lua_unlock(L); |
| 990 | return res; |
| 991 | } |
| 992 |
no test coverage detected