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