about summary refs log tree commit homepage
path: root/ext/mwrap/mwrap_core.h
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 /ext/mwrap/mwrap_core.h
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.
Diffstat (limited to 'ext/mwrap/mwrap_core.h')
-rw-r--r--ext/mwrap/mwrap_core.h5
1 files changed, 4 insertions, 1 deletions
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);
         }