| 904 | */ |
| 905 | |
| 906 | LUA_API int lua_gc (lua_State *L, int what, int data) { |
| 907 | int res = 0; |
| 908 | global_State *g; |
| 909 | lua_lock(L); |
| 910 | g = G(L); |
| 911 | switch (what) { |
| 912 | case LUA_GCSTOP: { |
| 913 | g->GCthreshold = MAX_LUMEM; |
| 914 | break; |
| 915 | } |
| 916 | case LUA_GCRESTART: { |
| 917 | g->GCthreshold = g->totalbytes; |
| 918 | break; |
| 919 | } |
| 920 | case LUA_GCCOLLECT: { |
| 921 | luaC_fullgc(L); |
| 922 | break; |
| 923 | } |
| 924 | case LUA_GCCOUNT: { |
| 925 | /* GC values are expressed in Kbytes: #bytes/2^10 */ |
| 926 | res = cast_int(g->totalbytes >> 10); |
| 927 | break; |
| 928 | } |
| 929 | case LUA_GCCOUNTB: { |
| 930 | res = cast_int(g->totalbytes & 0x3ff); |
| 931 | break; |
| 932 | } |
| 933 | case LUA_GCSTEP: { |
| 934 | lu_mem a = (cast(lu_mem, data) << 10); |
| 935 | if (a <= g->totalbytes) |
| 936 | g->GCthreshold = g->totalbytes - a; |
| 937 | else |
| 938 | g->GCthreshold = 0; |
| 939 | while (g->GCthreshold <= g->totalbytes) { |
| 940 | luaC_step(L); |
| 941 | if (g->gcstate == GCSpause) { /* end of cycle? */ |
| 942 | res = 1; /* signal it */ |
| 943 | break; |
| 944 | } |
| 945 | } |
| 946 | break; |
| 947 | } |
| 948 | case LUA_GCSETPAUSE: { |
| 949 | res = g->gcpause; |
| 950 | g->gcpause = data; |
| 951 | break; |
| 952 | } |
| 953 | case LUA_GCSETSTEPMUL: { |
| 954 | res = g->gcstepmul; |
| 955 | g->gcstepmul = data; |
| 956 | break; |
| 957 | } |
| 958 | default: res = -1; /* invalid option */ |
| 959 | } |
| 960 | lua_unlock(L); |
| 961 | return res; |
| 962 | } |
| 963 |
no test coverage detected