From 50a8863169b9d312b04443fbf72b8bde3d47b4d2 Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Wed, 12 Nov 2014 05:41:13 -0700 Subject: [PATCH] fix places-GC trigger when a large message is pending A large message that hasn't been delivered can trigger a inter-place GC. The intent is to force a GC to avoid messages piling up that can never be delivered, but the GC didn't adjust to a state where messages stay both undelivered and uncollected, and it would continuosly trigger GCs. Trigger a GC only if the pending-message size has grown relative to the previous GC. --- racket/src/racket/gc2/newgc.c | 4 +++- racket/src/racket/gc2/newgc.h | 1 + 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/racket/src/racket/gc2/newgc.c b/racket/src/racket/gc2/newgc.c index ffcaf34885f..a30bca8e879 100644 --- a/racket/src/racket/gc2/newgc.c +++ b/racket/src/racket/gc2/newgc.c @@ -932,7 +932,7 @@ void GC_check_master_gc_request() { if (mgc) { /* check for GC needed due to GC_report_unsent_message_delta(): */ - if ((mgc->gen0.current_size + mgc->pending_msg_size) >= mgc->gen0.max_size) { + if ((mgc->gen0.current_size + mgc->pending_msg_size) >= (mgc->gen0.max_size + mgc->prev_pending_msg_size)) { NewGC *gc = GC_get_GC(); if (!postmaster_and_master_gc(gc)) @@ -2749,6 +2749,8 @@ static void collect_master(Log_Master_Info *lmi) { GCVERBOSEprintf(gc, "END MASTER COLLECTION\n"); #endif + MASTERGC->prev_pending_msg_size = MASTERGC->pending_msg_size; + { int i = 0; int alive = MASTERGCINFO->alive; diff --git a/racket/src/racket/gc2/newgc.h b/racket/src/racket/gc2/newgc.h index b914ba9c479..8ec9356b392 100644 --- a/racket/src/racket/gc2/newgc.h +++ b/racket/src/racket/gc2/newgc.h @@ -153,6 +153,7 @@ typedef struct NewGC { void (*unsafe_allocation_abort)(struct NewGC *); uintptr_t memory_in_use; /* the amount of memory in use */ uintptr_t pending_msg_size; /* set in master, only */ + uintptr_t prev_pending_msg_size; /* set in master, only */ /* blame the child thread infos */ GC_Thread_Info *thread_infos;