| 2746 | */ |
| 2747 | |
| 2748 | LUA_API int lua_gc (lua_State *L, int what, int data) { |
| 2749 | int res = 0; |
| 2750 | global_State *g; |
| 2751 | lua_lock(L); |
| 2752 | g = G(L); |
| 2753 | switch (what) { |
| 2754 | case LUA_GCSTOP: { |
| 2755 | g->GCthreshold = MAX_LUMEM; |
| 2756 | break; |
| 2757 | } |
| 2758 | case LUA_GCRESTART: { |
| 2759 | g->GCthreshold = g->totalbytes; |
| 2760 | break; |
| 2761 | } |
| 2762 | case LUA_GCCOLLECT: { |
| 2763 | luaC_fullgc(L); |
| 2764 | break; |
| 2765 | } |
| 2766 | case LUA_GCCOUNT: { |
| 2767 | /* GC values are expressed in Kbytes: #bytes/2^10 */ |
| 2768 | res = cast_int(g->totalbytes >> 10); |
| 2769 | break; |
| 2770 | } |
| 2771 | case LUA_GCCOUNTB: { |
| 2772 | res = cast_int(g->totalbytes & 0x3ff); |
| 2773 | break; |
| 2774 | } |
| 2775 | case LUA_GCSTEP: { |
| 2776 | lu_mem a = (cast(lu_mem, data) << 10); |
| 2777 | if (a <= g->totalbytes) |
| 2778 | g->GCthreshold = g->totalbytes - a; |
| 2779 | else |
| 2780 | g->GCthreshold = 0; |
| 2781 | while (g->GCthreshold <= g->totalbytes) { |
| 2782 | luaC_step(L); |
| 2783 | if (g->gcstate == GCSpause) { /* end of cycle? */ |
| 2784 | res = 1; /* signal it */ |
| 2785 | break; |
| 2786 | } |
| 2787 | } |
| 2788 | break; |
| 2789 | } |
| 2790 | case LUA_GCSETPAUSE: { |
| 2791 | res = g->gcpause; |
| 2792 | g->gcpause = data; |
| 2793 | break; |
| 2794 | } |
| 2795 | case LUA_GCSETSTEPMUL: { |
| 2796 | res = g->gcstepmul; |
| 2797 | g->gcstepmul = data; |
| 2798 | break; |
| 2799 | } |
| 2800 | default: res = -1; /* invalid option */ |
| 2801 | } |
| 2802 | lua_unlock(L); |
| 2803 | return res; |
| 2804 | } |
| 2805 |
no test coverage detected