diff options
-rw-r--r-- | lapi.c | 7 | ||||
-rw-r--r-- | lbaselib.c | 8 | ||||
-rw-r--r-- | lgc.c | 46 | ||||
-rw-r--r-- | lstate.c | 7 | ||||
-rw-r--r-- | lstate.h | 3 | ||||
-rw-r--r-- | lua.h | 5 |
6 files changed, 41 insertions, 35 deletions
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lapi.c,v 2.188 2013/08/27 18:53:35 roberto Exp roberto $ | 2 | ** $Id: lapi.c,v 2.189 2013/09/11 20:15: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 | */ |
@@ -1086,6 +1086,11 @@ LUA_API int lua_gc (lua_State *L, int what, int data) { | |||
1086 | g->gcpause = data; | 1086 | g->gcpause = data; |
1087 | break; | 1087 | break; |
1088 | } | 1088 | } |
1089 | case LUA_GCSETLOCALPAUSE: { | ||
1090 | res = g->gclocalpause; | ||
1091 | g->gclocalpause = data; | ||
1092 | break; | ||
1093 | } | ||
1089 | case LUA_GCSETSTEPMUL: { | 1094 | case LUA_GCSETSTEPMUL: { |
1090 | res = g->gcstepmul; | 1095 | res = g->gcstepmul; |
1091 | g->gcstepmul = data; | 1096 | g->gcstepmul = data; |
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lbaselib.c,v 1.280 2013/07/10 17:15:12 roberto Exp roberto $ | 2 | ** $Id: lbaselib.c,v 1.281 2013/08/05 16:58:28 roberto Exp roberto $ |
3 | ** Basic library | 3 | ** Basic library |
4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
5 | */ | 5 | */ |
@@ -174,9 +174,11 @@ static int luaB_rawset (lua_State *L) { | |||
174 | 174 | ||
175 | static int luaB_collectgarbage (lua_State *L) { | 175 | static int luaB_collectgarbage (lua_State *L) { |
176 | static const char *const opts[] = {"stop", "restart", "collect", | 176 | static const char *const opts[] = {"stop", "restart", "collect", |
177 | "count", "step", "setpause", "setstepmul", "isrunning", NULL}; | 177 | "count", "step", "setpause", "setstepmul", |
178 | "setlocalpause", "isrunning", NULL}; | ||
178 | static const int optsnum[] = {LUA_GCSTOP, LUA_GCRESTART, LUA_GCCOLLECT, | 179 | static const int optsnum[] = {LUA_GCSTOP, LUA_GCRESTART, LUA_GCCOLLECT, |
179 | LUA_GCCOUNT, LUA_GCSTEP, LUA_GCSETPAUSE, LUA_GCSETSTEPMUL, LUA_GCISRUNNING}; | 180 | LUA_GCCOUNT, LUA_GCSTEP, LUA_GCSETPAUSE, LUA_GCSETSTEPMUL, |
181 | LUA_GCSETLOCALPAUSE, LUA_GCISRUNNING}; | ||
180 | int o = optsnum[luaL_checkoption(L, 1, "collect", opts)]; | 182 | int o = optsnum[luaL_checkoption(L, 1, "collect", opts)]; |
181 | int ex = luaL_optint(L, 2, 0); | 183 | int ex = luaL_optint(L, 2, 0); |
182 | int res = lua_gc(L, o, ex); | 184 | int res = lua_gc(L, o, ex); |
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lgc.c,v 2.163 2013/09/11 14:47:08 roberto Exp roberto $ | 2 | ** $Id: lgc.c,v 2.164 2013/09/11 14:56:15 roberto Exp roberto $ |
3 | ** Garbage Collector | 3 | ** Garbage Collector |
4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
5 | */ | 5 | */ |
@@ -25,12 +25,6 @@ | |||
25 | 25 | ||
26 | 26 | ||
27 | /* | 27 | /* |
28 | ** How much memory to allocate before a new local collection | ||
29 | */ | ||
30 | #define GCLOCALPAUSE 8000 | ||
31 | |||
32 | |||
33 | /* | ||
34 | ** cost of sweeping one element (the size of a small object divided | 28 | ** cost of sweeping one element (the size of a small object divided |
35 | ** by some adjust for the sweep speed) | 29 | ** by some adjust for the sweep speed) |
36 | */ | 30 | */ |
@@ -149,7 +143,7 @@ void luaC_barrier_ (lua_State *L, GCObject *o, GCObject *v) { | |||
149 | global_State *g = G(L); | 143 | global_State *g = G(L); |
150 | lua_assert(isblack(o) && iswhite(v) && !isdead(g, v) && !isdead(g, o)); | 144 | lua_assert(isblack(o) && iswhite(v) && !isdead(g, v) && !isdead(g, o)); |
151 | lua_assert(g->gcstate != GCSpause); | 145 | lua_assert(g->gcstate != GCSpause); |
152 | lua_assert(gch(o)->tt != LUA_TTABLE); | 146 | lua_assert(gch(o)->tt != LUA_TTABLE); /* tables use a back barrier */ |
153 | if (keepinvariant(g)) /* must keep invariant? */ | 147 | if (keepinvariant(g)) /* must keep invariant? */ |
154 | reallymarkobject(g, v); /* restore invariant */ | 148 | reallymarkobject(g, v); /* restore invariant */ |
155 | else { /* sweep phase */ | 149 | else { /* sweep phase */ |
@@ -888,19 +882,18 @@ void luaC_checkfinalizer (lua_State *L, GCObject *o, Table *mt) { | |||
888 | return; /* nothing to be done */ | 882 | return; /* nothing to be done */ |
889 | else { /* move 'o' to 'finobj' list */ | 883 | else { /* move 'o' to 'finobj' list */ |
890 | GCObject **p; | 884 | GCObject **p; |
891 | GCheader *ho = gch(o); | 885 | if (g->sweepgc == &o->gch.next) { /* avoid removing current sweep object */ |
892 | if (g->sweepgc == &ho->next) { /* avoid removing current sweep object */ | ||
893 | lua_assert(issweepphase(g)); | 886 | lua_assert(issweepphase(g)); |
894 | g->sweepgc = sweeptolive(L, g->sweepgc, NULL); | 887 | g->sweepgc = sweeptolive(L, g->sweepgc, NULL); |
895 | } | 888 | } |
896 | /* search for pointer pointing to 'o' */ | 889 | /* search for pointer pointing to 'o' */ |
897 | p = (testbit(ho->marked, LOCALMARK)) ? &g->allgc : &g->localgc; | 890 | p = (testbit(o->gch.marked, LOCALMARK)) ? &g->allgc : &g->localgc; |
898 | for (; *p != o; p = &gch(*p)->next) { /* empty */ } | 891 | for (; *p != o; p = &gch(*p)->next) { /* empty */ } |
899 | *p = ho->next; /* remove 'o' from its list */ | 892 | *p = o->gch.next; /* remove 'o' from its list */ |
900 | p = (testbit(ho->marked, LOCALMARK)) ? &g->finobj : &g->localfin; | 893 | p = (testbit(o->gch.marked, LOCALMARK)) ? &g->finobj : &g->localfin; |
901 | ho->next = *p; /* link it in a "fin" list */ | 894 | o->gch.next = *p; /* link it in a "fin" list */ |
902 | *p = o; | 895 | *p = o; |
903 | l_setbit(ho->marked, FINALIZEDBIT); /* mark it as such */ | 896 | l_setbit(o->gch.marked, FINALIZEDBIT); /* mark it as such */ |
904 | if (issweepphase(g)) | 897 | if (issweepphase(g)) |
905 | makewhite(g, o); /* "sweep" object */ | 898 | makewhite(g, o); /* "sweep" object */ |
906 | } | 899 | } |
@@ -1032,7 +1025,7 @@ static void setpause (global_State *g, l_mem estimate) { | |||
1032 | ? estimate * g->gcpause /* no overflow */ | 1025 | ? estimate * g->gcpause /* no overflow */ |
1033 | : MAX_LMEM; /* overflow; truncate to maximum */ | 1026 | : MAX_LMEM; /* overflow; truncate to maximum */ |
1034 | g->GCthreshold = threshold; | 1027 | g->GCthreshold = threshold; |
1035 | luaE_setdebt(g, -GCLOCALPAUSE); | 1028 | luaE_setdebt(g, -g->gclocalpause); |
1036 | } | 1029 | } |
1037 | 1030 | ||
1038 | 1031 | ||
@@ -1050,8 +1043,6 @@ static int entersweep (lua_State *L) { | |||
1050 | g->gcstate = GCSswplocalgc; | 1043 | g->gcstate = GCSswplocalgc; |
1051 | lua_assert(g->sweepgc == NULL); | 1044 | lua_assert(g->sweepgc == NULL); |
1052 | g->sweepgc = sweeptolive(L, &g->localgc, &n); | 1045 | g->sweepgc = sweeptolive(L, &g->localgc, &n); |
1053 | if (g->sweepgc == NULL) /* no live objects in local list? */ | ||
1054 | g->sweepgc = &g->localgc; /* 'sweepgc' cannot be NULL here */ | ||
1055 | return n; | 1046 | return n; |
1056 | } | 1047 | } |
1057 | 1048 | ||
@@ -1099,7 +1090,7 @@ static l_mem atomic (lua_State *L) { | |||
1099 | work += g->GCmemtrav; /* stop counting (objects being finalized) */ | 1090 | work += g->GCmemtrav; /* stop counting (objects being finalized) */ |
1100 | separatetobefnz(g, 0); /* separate objects to be finalized */ | 1091 | separatetobefnz(g, 0); /* separate objects to be finalized */ |
1101 | markbeingfnz(g); /* mark objects that will be finalized */ | 1092 | markbeingfnz(g); /* mark objects that will be finalized */ |
1102 | propagateall(g); /* remark, to propagate `preserveness' */ | 1093 | propagateall(g); /* remark, to propagate 'resurrection' */ |
1103 | work -= g->GCmemtrav; /* restart counting */ | 1094 | work -= g->GCmemtrav; /* restart counting */ |
1104 | convergeephemerons(g); | 1095 | convergeephemerons(g); |
1105 | /* at this point, all resurrected objects are marked. */ | 1096 | /* at this point, all resurrected objects are marked. */ |
@@ -1117,14 +1108,15 @@ static l_mem atomic (lua_State *L) { | |||
1117 | 1108 | ||
1118 | static lu_mem sweepstep (lua_State *L, global_State *g, | 1109 | static lu_mem sweepstep (lua_State *L, global_State *g, |
1119 | int nextstate, GCObject **nextlist) { | 1110 | int nextstate, GCObject **nextlist) { |
1120 | g->sweepgc = sweeplist(L, g->sweepgc, GCSWEEPMAX); | 1111 | if (g->sweepgc) { |
1121 | if (g->sweepgc) /* is there still something to sweep? */ | 1112 | g->sweepgc = sweeplist(L, g->sweepgc, GCSWEEPMAX); |
1122 | return (GCSWEEPMAX * GCSWEEPCOST); | 1113 | if (g->sweepgc) /* is there still something to sweep? */ |
1123 | else { /* enter next state */ | 1114 | return (GCSWEEPMAX * GCSWEEPCOST); |
1124 | g->gcstate = nextstate; | ||
1125 | g->sweepgc = nextlist; | ||
1126 | return 0; | ||
1127 | } | 1115 | } |
1116 | /* else enter next state */ | ||
1117 | g->gcstate = nextstate; | ||
1118 | g->sweepgc = nextlist; | ||
1119 | return 0; | ||
1128 | } | 1120 | } |
1129 | 1121 | ||
1130 | 1122 | ||
@@ -1245,7 +1237,7 @@ void luaC_step (lua_State *L) { | |||
1245 | luaC_forcestep(L); /* restart collection */ | 1237 | luaC_forcestep(L); /* restart collection */ |
1246 | } | 1238 | } |
1247 | else | 1239 | else |
1248 | luaE_setdebt(g, -GCLOCALPAUSE); | 1240 | luaE_setdebt(g, -g->gclocalpause); |
1249 | } | 1241 | } |
1250 | } | 1242 | } |
1251 | else luaE_setdebt(g, -GCSTEPSIZE); /* avoid being called too often */ | 1243 | else luaE_setdebt(g, -GCSTEPSIZE); /* avoid being called too often */ |
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lstate.c,v 2.112 2013/09/11 12:26:14 roberto Exp roberto $ | 2 | ** $Id: lstate.c,v 2.113 2013/09/11 14:09:55 roberto Exp roberto $ |
3 | ** Global State | 3 | ** Global State |
4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
5 | */ | 5 | */ |
@@ -30,6 +30,10 @@ | |||
30 | #define LUAI_GCPAUSE 200 /* 200% */ | 30 | #define LUAI_GCPAUSE 200 /* 200% */ |
31 | #endif | 31 | #endif |
32 | 32 | ||
33 | #if !defined(LUAI_GCLOCALPAUSE) | ||
34 | #define LUAI_GCLOCALPAUSE (1000 * sizeof(TString)) | ||
35 | #endif | ||
36 | |||
33 | #if !defined(LUAI_GCMUL) | 37 | #if !defined(LUAI_GCMUL) |
34 | #define LUAI_GCMUL 200 /* GC runs 'twice the speed' of memory allocation */ | 38 | #define LUAI_GCMUL 200 /* GC runs 'twice the speed' of memory allocation */ |
35 | #endif | 39 | #endif |
@@ -301,6 +305,7 @@ LUA_API lua_State *lua_newstate (lua_Alloc f, void *ud) { | |||
301 | g->totalbytes = sizeof(LG); | 305 | g->totalbytes = sizeof(LG); |
302 | g->GCdebt = 0; | 306 | g->GCdebt = 0; |
303 | g->gcpause = LUAI_GCPAUSE; | 307 | g->gcpause = LUAI_GCPAUSE; |
308 | g->gclocalpause = LUAI_GCLOCALPAUSE; | ||
304 | g->gcstepmul = LUAI_GCMUL; | 309 | g->gcstepmul = LUAI_GCMUL; |
305 | for (i=0; i < LUA_NUMTAGS; i++) g->mt[i] = NULL; | 310 | for (i=0; i < LUA_NUMTAGS; i++) g->mt[i] = NULL; |
306 | if (luaD_rawrunprotected(L, f_luaopen, NULL) != LUA_OK) { | 311 | if (luaD_rawrunprotected(L, f_luaopen, NULL) != LUA_OK) { |
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lstate.h,v 2.94 2013/09/05 19:31:49 roberto Exp roberto $ | 2 | ** $Id: lstate.h,v 2.95 2013/09/11 14:09:55 roberto Exp roberto $ |
3 | ** Global State | 3 | ** Global State |
4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
5 | */ | 5 | */ |
@@ -131,6 +131,7 @@ typedef struct global_State { | |||
131 | GCObject *fixedgc; /* list of objects not to be collected */ | 131 | GCObject *fixedgc; /* list of objects not to be collected */ |
132 | Mbuffer buff; /* temporary buffer for string concatenation */ | 132 | Mbuffer buff; /* temporary buffer for string concatenation */ |
133 | int gcpause; /* size of pause between successive GCs */ | 133 | int gcpause; /* size of pause between successive GCs */ |
134 | int gclocalpause; /* size of pause between local collections */ | ||
134 | int gcstepmul; /* GC `granularity' */ | 135 | int gcstepmul; /* GC `granularity' */ |
135 | lua_CFunction panic; /* to be called in unprotected errors */ | 136 | lua_CFunction panic; /* to be called in unprotected errors */ |
136 | struct lua_State *mainthread; | 137 | struct lua_State *mainthread; |
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lua.h,v 1.292 2013/07/05 14:29:51 roberto Exp roberto $ | 2 | ** $Id: lua.h,v 1.293 2013/08/05 16:58:28 roberto Exp roberto $ |
3 | ** Lua - A Scripting Language | 3 | ** Lua - A Scripting Language |
4 | ** Lua.org, PUC-Rio, Brazil (http://www.lua.org) | 4 | ** Lua.org, PUC-Rio, Brazil (http://www.lua.org) |
5 | ** See Copyright Notice at the end of this file | 5 | ** See Copyright Notice at the end of this file |
@@ -288,7 +288,8 @@ LUA_API int (lua_status) (lua_State *L); | |||
288 | #define LUA_GCSTEP 5 | 288 | #define LUA_GCSTEP 5 |
289 | #define LUA_GCSETPAUSE 6 | 289 | #define LUA_GCSETPAUSE 6 |
290 | #define LUA_GCSETSTEPMUL 7 | 290 | #define LUA_GCSETSTEPMUL 7 |
291 | #define LUA_GCISRUNNING 8 | 291 | #define LUA_GCSETLOCALPAUSE 8 |
292 | #define LUA_GCISRUNNING 9 | ||
292 | 293 | ||
293 | LUA_API int (lua_gc) (lua_State *L, int what, int data); | 294 | LUA_API int (lua_gc) (lua_State *L, int what, int data); |
294 | 295 | ||