From 13722232fb3b38339d728ffd4cd5dfe344116b63 Mon Sep 17 00:00:00 2001 From: Cory McWilliams Date: Wed, 19 Mar 2025 07:47:10 -0400 Subject: [PATCH] ssb: Don't let GC saturate the main thread during replication. --- src/task.c | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/src/task.c b/src/task.c index 1de0f192..4a20af47 100644 --- a/src/task.c +++ b/src/task.c @@ -169,6 +169,9 @@ typedef struct _tf_task_t timeout_t* timeouts; hitch_t hitches[32]; + + uint64_t last_gc_ns; + int64_t last_gc_duration_ns; } tf_task_t; typedef struct _export_record_t @@ -1456,12 +1459,19 @@ static void _tf_task_promise_rejection_tracker(JSContext* context, JSValueConst static void _tf_task_gc_timer(uv_timer_t* timer) { tf_task_t* task = timer->data; - tf_trace_begin(task->_trace, "JS_RunGC"); - JS_RunGC(task->_runtime); - tf_trace_end(task->_trace); + uint64_t start_ns = uv_hrtime(); + if (task->last_gc_duration_ns < (int64_t)(start_ns - task->last_gc_ns)) + { + tf_trace_begin(task->_trace, "JS_RunGC"); + JS_RunGC(task->_runtime); + tf_trace_end(task->_trace); #ifdef M_TRIM_THRESHOLD - malloc_trim(0); + malloc_trim(0); #endif + uint64_t end_ns = uv_hrtime(); + task->last_gc_duration_ns = end_ns - start_ns; + task->last_gc_ns = end_ns; + } } static void _tf_task_trace_timer(uv_timer_t* timer)