~ chicken-core (chicken-5) cfd75ecd9a59a00f372a729f06b8007893745b37
commit cfd75ecd9a59a00f372a729f06b8007893745b37
Author: Peter Bex <peter@more-magic.net>
AuthorDate: Wed May 22 13:53:28 2024 +0200
Commit: felix <felix@call-with-current-continuation.org>
CommitDate: Wed May 22 15:40:03 2024 +0200
Don't free the memory for the scratchspace on minor GC
This is too costly if we're in a loop that's operating on the
scratchspace, because it will just reallocate the scratchspace, and
use a small scratchspace which will cause excessive reallocation.
Signed-off-by: felix <felix@call-with-current-continuation.org>
diff --git a/runtime.c b/runtime.c
index 9becd2aa..5116ed37 100644
--- a/runtime.c
+++ b/runtime.c
@@ -3675,13 +3675,16 @@ C_regparm void C_fcall C_reclaim(void *trampoline, C_word c)
}
/* GC will have copied any live objects out of scratch space: clear it */
- if (C_scratchspace_start != NULL) {
- C_free(C_scratchspace_start);
- C_scratchspace_start = NULL;
- C_scratchspace_top = NULL;
- C_scratchspace_limit = NULL;
+ if (C_scratchspace_start != C_scratchspace_top) {
+ /* And drop the scratchspace in case of a major or reallocating collection */
+ if (gc_mode != GC_MINOR) {
+ C_free(C_scratchspace_start);
+ C_scratchspace_start = NULL;
+ C_scratchspace_limit = NULL;
+ scratchspace_size = 0;
+ }
+ C_scratchspace_top = C_scratchspace_start;
C_scratch_usage = 0;
- scratchspace_size = 0;
}
if(gc_mode == GC_MAJOR) {
Trap