diff options
| author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2010-12-20 16:17:46 -0200 |
|---|---|---|
| committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2010-12-20 16:17:46 -0200 |
| commit | 737f119187aca3c8f6743ec6e3cfc04e83723180 (patch) | |
| tree | 4e1bfb4b2bef35dd2acfe2915ab51481cd9ebc16 /lapi.c | |
| parent | 8980c630bf40e05dad71ded377e3d0f0a17b076c (diff) | |
| download | lua-737f119187aca3c8f6743ec6e3cfc04e83723180.tar.gz lua-737f119187aca3c8f6743ec6e3cfc04e83723180.tar.bz2 lua-737f119187aca3c8f6743ec6e3cfc04e83723180.zip | |
better control for GC running or stopped
Diffstat (limited to 'lapi.c')
| -rw-r--r-- | lapi.c | 14 |
1 files changed, 8 insertions, 6 deletions
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lapi.c,v 2.141 2010/11/18 19:15:00 roberto Exp roberto $ | 2 | ** $Id: lapi.c,v 2.141 2010/11/26 14:32:31 roberto Exp roberto $ |
| 3 | ** Lua API | 3 | ** Lua API |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -960,14 +960,16 @@ LUA_API int lua_gc (lua_State *L, int what, int data) { | |||
| 960 | g = G(L); | 960 | g = G(L); |
| 961 | switch (what) { | 961 | switch (what) { |
| 962 | case LUA_GCSTOP: { | 962 | case LUA_GCSTOP: { |
| 963 | stopgc(g); | 963 | g->gcrunning = 0; |
| 964 | break; | 964 | break; |
| 965 | } | 965 | } |
| 966 | case LUA_GCRESTART: { | 966 | case LUA_GCRESTART: { |
| 967 | g->GCdebt = 0; | 967 | g->GCdebt = 0; |
| 968 | g->gcrunning = 1; | ||
| 968 | break; | 969 | break; |
| 969 | } | 970 | } |
| 970 | case LUA_GCCOLLECT: { | 971 | case LUA_GCCOLLECT: { |
| 972 | g->gcrunning = 1; /* restart collector if stopped ?? */ | ||
| 971 | luaC_fullgc(L, 0); | 973 | luaC_fullgc(L, 0); |
| 972 | break; | 974 | break; |
| 973 | } | 975 | } |
| @@ -981,7 +983,8 @@ LUA_API int lua_gc (lua_State *L, int what, int data) { | |||
| 981 | break; | 983 | break; |
| 982 | } | 984 | } |
| 983 | case LUA_GCSTEP: { | 985 | case LUA_GCSTEP: { |
| 984 | int stopped = gcstopped(g); | 986 | int running = g->gcrunning; |
| 987 | g->gcrunning = 1; /* allow steps */ | ||
| 985 | if (g->gckind == KGC_GEN) { /* generational mode? */ | 988 | if (g->gckind == KGC_GEN) { /* generational mode? */ |
| 986 | res = (g->lastmajormem == 0); /* 1 if will do major collection */ | 989 | res = (g->lastmajormem == 0); /* 1 if will do major collection */ |
| 987 | luaC_step(L); /* do a single step */ | 990 | luaC_step(L); /* do a single step */ |
| @@ -995,8 +998,7 @@ LUA_API int lua_gc (lua_State *L, int what, int data) { | |||
| 995 | } | 998 | } |
| 996 | } | 999 | } |
| 997 | } | 1000 | } |
| 998 | if (stopped) /* collector was stopped? */ | 1001 | g->gcrunning = running; /* restore previous state */ |
| 999 | stopgc(g); /* keep it that way */ | ||
| 1000 | break; | 1002 | break; |
| 1001 | } | 1003 | } |
| 1002 | case LUA_GCSETPAUSE: { | 1004 | case LUA_GCSETPAUSE: { |
| @@ -1015,7 +1017,7 @@ LUA_API int lua_gc (lua_State *L, int what, int data) { | |||
| 1015 | break; | 1017 | break; |
| 1016 | } | 1018 | } |
| 1017 | case LUA_GCISRUNNING: { | 1019 | case LUA_GCISRUNNING: { |
| 1018 | res = !gcstopped(g); | 1020 | res = g->gcrunning; |
| 1019 | break; | 1021 | break; |
| 1020 | } | 1022 | } |
| 1021 | case LUA_GCGEN: { /* change collector to generational mode */ | 1023 | case LUA_GCGEN: { /* change collector to generational mode */ |
