diff options
| author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 1996-04-29 15:53:53 -0300 |
|---|---|---|
| committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 1996-04-29 15:53:53 -0300 |
| commit | 21c9ebf4a9891786d5683537868cc348340ca89d (patch) | |
| tree | c0e0eb45ac121869ca62ee420863f17de6463d6e | |
| parent | 4fb77c430869e4a6c95fd00cd6a9b9c383d95e71 (diff) | |
| download | lua-21c9ebf4a9891786d5683537868cc348340ca89d.tar.gz lua-21c9ebf4a9891786d5683537868cc348340ca89d.tar.bz2 lua-21c9ebf4a9891786d5683537868cc348340ca89d.zip | |
new algotithm to adjust garbage collection: it tries to adapt gc calls
so that it collects half of the total objects when it is called.
| -rw-r--r-- | table.c | 16 |
1 files changed, 7 insertions, 9 deletions
| @@ -3,7 +3,7 @@ | |||
| 3 | ** Module to control static tables | 3 | ** Module to control static tables |
| 4 | */ | 4 | */ |
| 5 | 5 | ||
| 6 | char *rcs_table="$Id: table.c,v 2.51 1996/03/21 18:54:29 roberto Exp roberto $"; | 6 | char *rcs_table="$Id: table.c,v 2.52 1996/04/22 18:00:37 roberto Exp $"; |
| 7 | 7 | ||
| 8 | #include "mem.h" | 8 | #include "mem.h" |
| 9 | #include "opcode.h" | 9 | #include "opcode.h" |
| @@ -27,8 +27,7 @@ Word lua_nconstant = 0; | |||
| 27 | static Long lua_maxconstant = 0; | 27 | static Long lua_maxconstant = 0; |
| 28 | 28 | ||
| 29 | 29 | ||
| 30 | #define GARBAGE_BLOCK 1024 | 30 | #define GARBAGE_BLOCK 50 |
| 31 | #define MIN_GARBAGE_BLOCK (GARBAGE_BLOCK/2) | ||
| 32 | 31 | ||
| 33 | static void lua_nextvar (void); | 32 | static void lua_nextvar (void); |
| 34 | 33 | ||
| @@ -209,14 +208,13 @@ Long luaI_collectgarbage (void) | |||
| 209 | 208 | ||
| 210 | void lua_pack (void) | 209 | void lua_pack (void) |
| 211 | { | 210 | { |
| 212 | static Long block = GARBAGE_BLOCK; /* when garbage collector will be called */ | 211 | static unsigned long block = GARBAGE_BLOCK; |
| 213 | static Long nentity = 0; /* counter of new entities (strings and arrays) */ | 212 | static unsigned long nentity = 0; /* total of strings, arrays, etc */ |
| 214 | Long recovered = 0; | 213 | unsigned long recovered = 0; |
| 215 | if (nentity++ < block) return; | 214 | if (nentity++ < block) return; |
| 216 | recovered = luaI_collectgarbage(); | 215 | recovered = luaI_collectgarbage(); |
| 217 | nentity = 0; /* reset counter */ | 216 | block = block*2*(1.0 - (float)recovered/nentity); |
| 218 | block=(16*block-7*recovered)/12; /* adapt block size */ | 217 | nentity -= recovered; |
| 219 | if (block < MIN_GARBAGE_BLOCK) block = MIN_GARBAGE_BLOCK; | ||
| 220 | } | 218 | } |
| 221 | 219 | ||
| 222 | 220 | ||
