aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2010-04-29 14:31:31 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2010-04-29 14:31:31 -0300
commit3eb1788bb4236cd983f1230ee14e2adb1b5b3ff5 (patch)
tree6c2c41dd92bacf2dfe266d750b61b28a67198f9a
parent00114a95b2a1234954a46fca6221d1c6922713f8 (diff)
downloadlua-3eb1788bb4236cd983f1230ee14e2adb1b5b3ff5.tar.gz
lua-3eb1788bb4236cd983f1230ee14e2adb1b5b3ff5.tar.bz2
lua-3eb1788bb4236cd983f1230ee14e2adb1b5b3ff5.zip
new way to control GC speed (keeping a 'debt' counter)
-rw-r--r--lapi.c14
-rw-r--r--llimits.h3
-rw-r--r--lstate.h4
3 files changed, 11 insertions, 10 deletions
diff --git a/lapi.c b/lapi.c
index e29db1c3..766878d7 100644
--- a/lapi.c
+++ b/lapi.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lapi.c,v 2.123 2010/04/19 16:33:19 roberto Exp roberto $ 2** $Id: lapi.c,v 2.124 2010/04/20 20:14:50 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*/
@@ -913,11 +913,11 @@ LUA_API int lua_gc (lua_State *L, int what, int data) {
913 g = G(L); 913 g = G(L);
914 switch (what) { 914 switch (what) {
915 case LUA_GCSTOP: { 915 case LUA_GCSTOP: {
916 g->GCthreshold = MAX_LUMEM; 916 stopgc(g);
917 break; 917 break;
918 } 918 }
919 case LUA_GCRESTART: { 919 case LUA_GCRESTART: {
920 g->GCthreshold = g->totalbytes; 920 g->GCdebt = 0;
921 break; 921 break;
922 } 922 }
923 case LUA_GCCOLLECT: { 923 case LUA_GCCOLLECT: {
@@ -934,7 +934,7 @@ LUA_API int lua_gc (lua_State *L, int what, int data) {
934 break; 934 break;
935 } 935 }
936 case LUA_GCSTEP: { 936 case LUA_GCSTEP: {
937 lu_mem oldts = g->GCthreshold; 937 int stopped = gcstopped(g);
938 if (g->gckind == KGC_GEN) { /* generational mode? */ 938 if (g->gckind == KGC_GEN) { /* generational mode? */
939 res = (g->lastmajormem == 0); /* 1 if will do major collection */ 939 res = (g->lastmajormem == 0); /* 1 if will do major collection */
940 luaC_step(L); /* do a single step */ 940 luaC_step(L); /* do a single step */
@@ -948,8 +948,8 @@ LUA_API int lua_gc (lua_State *L, int what, int data) {
948 } 948 }
949 } 949 }
950 } 950 }
951 if (oldts == MAX_LUMEM) /* collector was stopped? */ 951 if (stopped) /* collector was stopped? */
952 g->GCthreshold = oldts; /* keep it that way */ 952 stopgc(g); /* keep it that way */
953 break; 953 break;
954 } 954 }
955 case LUA_GCSETPAUSE: { 955 case LUA_GCSETPAUSE: {
@@ -963,7 +963,7 @@ LUA_API int lua_gc (lua_State *L, int what, int data) {
963 break; 963 break;
964 } 964 }
965 case LUA_GCISRUNNING: { 965 case LUA_GCISRUNNING: {
966 res = (g->GCthreshold != MAX_LUMEM); 966 res = !gcstopped(g);
967 break; 967 break;
968 } 968 }
969 case LUA_GCGEN: { /* change collector to generational mode */ 969 case LUA_GCGEN: { /* change collector to generational mode */
diff --git a/llimits.h b/llimits.h
index b7459533..e4279f18 100644
--- a/llimits.h
+++ b/llimits.h
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: llimits.h,v 1.77 2009/12/17 12:50:20 roberto Exp roberto $ 2** $Id: llimits.h,v 1.78 2010/04/19 17:40:13 roberto Exp roberto $
3** Limits, basic types, and some other `installation-dependent' definitions 3** Limits, basic types, and some other `installation-dependent' definitions
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -30,6 +30,7 @@ typedef unsigned char lu_byte;
30#define MAX_SIZET ((size_t)(~(size_t)0)-2) 30#define MAX_SIZET ((size_t)(~(size_t)0)-2)
31 31
32#define MAX_LUMEM ((lu_mem)(~(lu_mem)0)-2) 32#define MAX_LUMEM ((lu_mem)(~(lu_mem)0)-2)
33#define MIN_LMEM ((l_mem)~((~(lu_mem)0)>>1))
33 34
34 35
35#define MAX_INT (INT_MAX-2) /* maximum value of an int (-2 for safety) */ 36#define MAX_INT (INT_MAX-2) /* maximum value of an int (-2 for safety) */
diff --git a/lstate.h b/lstate.h
index 734898d0..28fd8d92 100644
--- a/lstate.h
+++ b/lstate.h
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lstate.h,v 2.62 2010/04/12 16:07:06 roberto Exp roberto $ 2** $Id: lstate.h,v 2.63 2010/04/13 20:48:12 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*/
@@ -116,7 +116,7 @@ typedef struct global_State {
116 lua_Alloc frealloc; /* function to reallocate memory */ 116 lua_Alloc frealloc; /* function to reallocate memory */
117 void *ud; /* auxiliary data to `frealloc' */ 117 void *ud; /* auxiliary data to `frealloc' */
118 lu_mem totalbytes; /* number of bytes currently allocated */ 118 lu_mem totalbytes; /* number of bytes currently allocated */
119 lu_mem GCthreshold; /* when totalbytes > GCthreshold, run GC step */ 119 l_mem GCdebt; /* when positive, run a GC step */
120 lu_mem lastmajormem; /* memory in use after last major collection */ 120 lu_mem lastmajormem; /* memory in use after last major collection */
121 stringtable strt; /* hash table for strings */ 121 stringtable strt; /* hash table for strings */
122 TValue l_registry; 122 TValue l_registry;