wingo pushed a commit to branch wip-whippet
in repository guile.

commit 8e1574491adf4cfa8021626e3641e86221b942e3
Author: Andy Wingo <wi...@igalia.com>
AuthorDate: Tue Oct 1 13:16:43 2024 +0200

    Fix ephemerons test for mmc
    
    Change to avoid detecting OOM based on no allocation since last GC, if
    the collection was explicitly triggered by the user.
---
 src/mmc.c | 20 ++++++++++++--------
 1 file changed, 12 insertions(+), 8 deletions(-)

diff --git a/src/mmc.c b/src/mmc.c
index 63778d669..8f9326cde 100644
--- a/src/mmc.c
+++ b/src/mmc.c
@@ -712,9 +712,11 @@ sweep_ephemerons(struct gc_heap *heap) {
 }
 
 static void collect(struct gc_mutator *mut,
-                    enum gc_collection_kind requested_kind) GC_NEVER_INLINE;
+                    enum gc_collection_kind requested_kind,
+                    int requested_by_user) GC_NEVER_INLINE;
 static void
-collect(struct gc_mutator *mut, enum gc_collection_kind requested_kind) {
+collect(struct gc_mutator *mut, enum gc_collection_kind requested_kind,
+        int requested_by_user) {
   struct gc_heap *heap = mutator_heap(mut);
   struct nofl_space *nofl_space = heap_nofl_space(heap);
   struct large_object_space *lospace = heap_large_object_space(heap);
@@ -732,7 +734,8 @@ collect(struct gc_mutator *mut, enum gc_collection_kind 
requested_kind) {
   nofl_space_add_to_allocation_counter(nofl_space, &allocation_counter);
   large_object_space_add_to_allocation_counter(lospace, &allocation_counter);
   heap->total_allocated_bytes_at_last_gc += allocation_counter;
-  detect_out_of_memory(heap, allocation_counter);
+  if (!requested_by_user)
+    detect_out_of_memory(heap, allocation_counter);
   enum gc_collection_kind gc_kind =
     determine_collection_kind(heap, requested_kind);
   int is_minor = gc_kind == GC_COLLECTION_MINOR;
@@ -783,7 +786,8 @@ collect(struct gc_mutator *mut, enum gc_collection_kind 
requested_kind) {
 
 static void
 trigger_collection(struct gc_mutator *mut,
-                   enum gc_collection_kind requested_kind) {
+                   enum gc_collection_kind requested_kind,
+                   int requested_by_user) {
   struct gc_heap *heap = mutator_heap(mut);
   int prev_kind = -1;
   gc_stack_capture_hot(&mut->stack);
@@ -792,13 +796,13 @@ trigger_collection(struct gc_mutator *mut,
   while (mutators_are_stopping(heap))
     prev_kind = pause_mutator_for_collection(heap, mut);
   if (prev_kind < (int)requested_kind)
-    collect(mut, requested_kind);
+    collect(mut, requested_kind, requested_by_user);
   heap_unlock(heap);
 }
 
 void
 gc_collect(struct gc_mutator *mut, enum gc_collection_kind kind) {
-  trigger_collection(mut, kind);
+  trigger_collection(mut, kind, 1);
 }
 
 int*
@@ -829,7 +833,7 @@ allocate_large(struct gc_mutator *mut, size_t size) {
                                     npages << lospace->page_size_log2);
 
   while (!nofl_space_shrink(nofl_space, 0))
-    trigger_collection(mut, GC_COLLECTION_COMPACTING);
+    trigger_collection(mut, GC_COLLECTION_COMPACTING, 0);
   atomic_fetch_add(&heap->large_object_pages, npages);
 
   void *ret = large_object_space_alloc(lospace, npages);
@@ -846,7 +850,7 @@ allocate_large(struct gc_mutator *mut, size_t size) {
 
 static void
 collect_for_small_allocation(void *mut) {
-  trigger_collection(mut, GC_COLLECTION_ANY);
+  trigger_collection(mut, GC_COLLECTION_ANY, 0);
 }
 
 void*

Reply via email to