diff options
author | Eric Wong <e@80x24.org> | 2023-01-08 23:43:24 +0000 |
---|---|---|
committer | Eric Wong <e@80x24.org> | 2023-01-09 05:07:38 +0000 |
commit | 9039f3518498a6f08f63d59342c4c6aa6c1696d6 (patch) | |
tree | e22cb482aa53f3d3c97fb29b44d6484f1a6a47b9 | |
parent | b344bcc056e4c0dde8385bd7b4c60e20e04d9263 (diff) | |
download | mwrap-9039f3518498a6f08f63d59342c4c6aa6c1696d6.tar.gz |
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.
-rw-r--r-- | ext/mwrap/httpd.h | 3 | ||||
-rw-r--r-- | ext/mwrap/mwrap_core.h | 5 |
2 files changed, 7 insertions, 1 deletions
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); } |