diff options
| author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2010-12-29 16:00:23 -0200 |
|---|---|---|
| committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2010-12-29 16:00:23 -0200 |
| commit | 868ff40339fc72b7bf3c916afcdc2a992398346c (patch) | |
| tree | 86864c97d7b1e7620a8c09e43e40cd7d6d3a5f89 /lapi.c | |
| parent | aa6faa6331e3e5e326bf5830474ffd9b04425678 (diff) | |
| download | lua-868ff40339fc72b7bf3c916afcdc2a992398346c.tar.gz lua-868ff40339fc72b7bf3c916afcdc2a992398346c.tar.bz2 lua-868ff40339fc72b7bf3c916afcdc2a992398346c.zip | |
full collection does not restart collector + avoid changing GC
state if an error happens in a step
Diffstat (limited to 'lapi.c')
| -rw-r--r-- | lapi.c | 10 |
1 files changed, 3 insertions, 7 deletions
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lapi.c,v 2.142 2010/12/20 18:17:46 roberto Exp roberto $ | 2 | ** $Id: lapi.c,v 2.143 2010/12/20 19:40:07 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 | */ |
| @@ -969,7 +969,6 @@ LUA_API int lua_gc (lua_State *L, int what, int data) { | |||
| 969 | break; | 969 | break; |
| 970 | } | 970 | } |
| 971 | case LUA_GCCOLLECT: { | 971 | case LUA_GCCOLLECT: { |
| 972 | g->gcrunning = 1; /* restart collector if stopped ?? */ | ||
| 973 | luaC_fullgc(L, 0); | 972 | luaC_fullgc(L, 0); |
| 974 | break; | 973 | break; |
| 975 | } | 974 | } |
| @@ -983,22 +982,19 @@ LUA_API int lua_gc (lua_State *L, int what, int data) { | |||
| 983 | break; | 982 | break; |
| 984 | } | 983 | } |
| 985 | case LUA_GCSTEP: { | 984 | case LUA_GCSTEP: { |
| 986 | int running = g->gcrunning; | ||
| 987 | g->gcrunning = 1; /* allow steps */ | ||
| 988 | if (g->gckind == KGC_GEN) { /* generational mode? */ | 985 | if (g->gckind == KGC_GEN) { /* generational mode? */ |
| 989 | res = (g->lastmajormem == 0); /* 1 if will do major collection */ | 986 | res = (g->lastmajormem == 0); /* 1 if will do major collection */ |
| 990 | luaC_step(L); /* do a single step */ | 987 | luaC_forcestep(L); /* do a single step */ |
| 991 | } | 988 | } |
| 992 | else { | 989 | else { |
| 993 | while (data-- >= 0) { | 990 | while (data-- >= 0) { |
| 994 | luaC_step(L); | 991 | luaC_forcestep(L); |
| 995 | if (g->gcstate == GCSpause) { /* end of cycle? */ | 992 | if (g->gcstate == GCSpause) { /* end of cycle? */ |
| 996 | res = 1; /* signal it */ | 993 | res = 1; /* signal it */ |
| 997 | break; | 994 | break; |
| 998 | } | 995 | } |
| 999 | } | 996 | } |
| 1000 | } | 997 | } |
| 1001 | g->gcrunning = running; /* restore previous state */ | ||
| 1002 | break; | 998 | break; |
| 1003 | } | 999 | } |
| 1004 | case LUA_GCSETPAUSE: { | 1000 | case LUA_GCSETPAUSE: { |
