diff options
| author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2006-05-24 11:33:49 -0300 |
|---|---|---|
| committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2006-05-24 11:33:49 -0300 |
| commit | ad0765b4f01706c367e0e2f431c2043021b9361d (patch) | |
| tree | 599e58b605c0bf16eba136e2a1bfbc5077f9d551 | |
| parent | 20f4bbdc3a39446345e5f6433c7c71de60f8a0b7 (diff) | |
| download | lua-ad0765b4f01706c367e0e2f431c2043021b9361d.tar.gz lua-ad0765b4f01706c367e0e2f431c2043021b9361d.tar.bz2 lua-ad0765b4f01706c367e0e2f431c2043021b9361d.zip | |
subtle problem with the garbage collector
| -rw-r--r-- | bugs | 30 |
1 files changed, 29 insertions, 1 deletions
| @@ -925,7 +925,7 @@ patch = [[ | |||
| 925 | } | 925 | } |
| 926 | 926 | ||
| 927 | 927 | ||
| 928 | @Bug{ | 928 | Bug{ |
| 929 | what = [[lua_dostring/lua_dofile should return any values returned | 929 | what = [[lua_dostring/lua_dofile should return any values returned |
| 930 | by the chunk]], | 930 | by the chunk]], |
| 931 | 931 | ||
| @@ -946,3 +946,31 @@ patch = [[ | |||
| 946 | ]], | 946 | ]], |
| 947 | 947 | ||
| 948 | } | 948 | } |
| 949 | |||
| 950 | |||
| 951 | Bug{ | ||
| 952 | |||
| 953 | what = [[garbage collector does not compensate enough for finalizers]], | ||
| 954 | |||
| 955 | patch = [[ | ||
| 956 | lgc.c: | ||
| 957 | @@ -322,4 +322,6 @@ | ||
| 958 | |||
| 959 | -static void propagateall (global_State *g) { | ||
| 960 | - while (g->gray) propagatemark(g); | ||
| 961 | +static size_t propagateall (global_State *g) { | ||
| 962 | + size_t m = 0; | ||
| 963 | + while (g->gray) m += propagatemark(g); | ||
| 964 | + return m; | ||
| 965 | } | ||
| 966 | @@ -542,3 +544,3 @@ | ||
| 967 | marktmu(g); /* mark `preserved' userdata */ | ||
| 968 | - propagateall(g); /* remark, to propagate `preserveness' */ | ||
| 969 | + udsize += propagateall(g); /* remark, to propagate `preserveness' */ | ||
| 970 | cleartable(g->weak); /* remove collected objects from weak tables */ | ||
| 971 | @@ -592,2 +594,4 @@ | ||
| 972 | GCTM(L); | ||
| 973 | + if (g->estimate > GCFINALIZECOST) | ||
| 974 | + g->estimate -= GCFINALIZECOST; | ||
| 975 | ]] | ||
| 976 | } | ||
