From 9039f3518498a6f08f63d59342c4c6aa6c1696d6 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Sun, 8 Jan 2023 23:43:24 +0000 Subject: httpd: show GC count We can't call rb_gc_count() safely outside of Ruby threads (especially during startup/teardown), but we can share it's last-known value safely. --- ext/mwrap/httpd.h | 3 +++ ext/mwrap/mwrap_core.h | 5 ++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/ext/mwrap/httpd.h b/ext/mwrap/httpd.h index 03aef9f..0ef6cd9 100644 --- a/ext/mwrap/httpd.h +++ b/ext/mwrap/httpd.h @@ -548,6 +548,9 @@ static void show_stats(FILE *fp) "/ files: %zu / locations: %zu", inc , inc - dec, uatomic_read(&nr_file), uatomic_read(&nr_src_loc)); +#if MWRAP_RUBY + fprintf(fp, " / GC: %zu", uatomic_read(&last_gc_count)); +#endif } /* /$PID/at/$LOCATION endpoint */ diff --git a/ext/mwrap/mwrap_core.h b/ext/mwrap/mwrap_core.h index 48669d5..827ee7b 100644 --- a/ext/mwrap/mwrap_core.h +++ b/ext/mwrap/mwrap_core.h @@ -85,6 +85,7 @@ static size_t *root_locating; /* determines if PL_curcop is our thread */ #if MWRAP_RUBY static void mw_ruby_set_generation(size_t *, size_t); # define SET_GENERATION(gen, size) mw_ruby_set_generation(gen, size) +static size_t last_gc_count; /* for httpd which runs in a non-GVL thread */ #endif /* MWRAP_RUBY */ #ifndef SET_GENERATION /* C-only builds w/o Perl|Ruby */ @@ -1074,8 +1075,10 @@ static void mw_ruby_set_generation(size_t *gen, size_t size) { if (rb_gc_count) { uatomic_add_return(&total_bytes_inc, size); - if (has_ec_p()) + if (has_ec_p()) { *gen = rb_gc_count(); + uatomic_set(&last_gc_count, *gen); + } } else { *gen = uatomic_add_return(&total_bytes_inc, size); } -- cgit v1.2.3-24-ge0c7