about summary refs log tree commit homepage
diff options
context:
space:
mode:
authorEric Wong <e@80x24.org>2023-01-08 23:43:24 +0000
committerEric Wong <e@80x24.org>2023-01-09 05:07:38 +0000
commit9039f3518498a6f08f63d59342c4c6aa6c1696d6 (patch)
treee22cb482aa53f3d3c97fb29b44d6484f1a6a47b9
parentb344bcc056e4c0dde8385bd7b4c60e20e04d9263 (diff)
downloadmwrap-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.h3
-rw-r--r--ext/mwrap/mwrap_core.h5
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);
         }