From 61de3dd727146cfcf24e8051595bb2fb842f37aa Mon Sep 17 00:00:00 2001 From: Luke Gruber Date: Fri, 18 Sep 2026 12:43:02 -0400 Subject: [PATCH 1/4] [ruby/openssl] Make ruby/openssl types RUBY_TYPED_THREAD_SAFE_FREE It's safe to free these types during Ractor-local GC in Ruby 4.1. We've seen the freeing of this type show up in profiles before. https://github.com/ruby/openssl/commit/e481c6408f Co-authored-by: Kazuki Yamaguchi --- ext/openssl/ossl.h | 3 +++ ext/openssl/ossl_bn.c | 2 +- ext/openssl/ossl_cipher.c | 4 ++-- ext/openssl/ossl_config.c | 2 +- ext/openssl/ossl_digest.c | 4 ++-- ext/openssl/ossl_engine.c | 2 +- ext/openssl/ossl_hmac.c | 2 +- ext/openssl/ossl_hpke.c | 4 ++-- ext/openssl/ossl_ns_spki.c | 2 +- ext/openssl/ossl_ocsp.c | 10 +++++----- ext/openssl/ossl_pkcs12.c | 2 +- ext/openssl/ossl_pkcs7.c | 6 +++--- ext/openssl/ossl_pkey.c | 2 +- ext/openssl/ossl_pkey_ec.c | 4 ++-- ext/openssl/ossl_provider.c | 2 +- ext/openssl/ossl_ssl.c | 4 ++-- ext/openssl/ossl_ssl_session.c | 2 +- ext/openssl/ossl_ts.c | 6 +++--- ext/openssl/ossl_x509attr.c | 2 +- ext/openssl/ossl_x509cert.c | 2 +- ext/openssl/ossl_x509crl.c | 2 +- ext/openssl/ossl_x509ext.c | 4 ++-- ext/openssl/ossl_x509name.c | 2 +- ext/openssl/ossl_x509req.c | 2 +- ext/openssl/ossl_x509revoked.c | 2 +- ext/openssl/ossl_x509store.c | 4 ++-- 26 files changed, 43 insertions(+), 40 deletions(-) diff --git a/ext/openssl/ossl.h b/ext/openssl/ossl.h index 133cc0126812ee..12a9db214772a7 100644 --- a/ext/openssl/ossl.h +++ b/ext/openssl/ossl.h @@ -22,6 +22,9 @@ #else #define RUBY_TYPED_FROZEN_SHAREABLE 0 #endif +#if !defined(RUBY_TYPED_THREAD_SAFE_FREE) +#define RUBY_TYPED_THREAD_SAFE_FREE RUBY_TYPED_FREE_IMMEDIATELY +#endif #include diff --git a/ext/openssl/ossl_bn.c b/ext/openssl/ossl_bn.c index 9014f2df2b9df9..621419211fa48f 100644 --- a/ext/openssl/ossl_bn.c +++ b/ext/openssl/ossl_bn.c @@ -37,7 +37,7 @@ static const rb_data_type_t ossl_bn_type = { { 0, ossl_bn_free, }, - 0, 0, RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED | RUBY_TYPED_FROZEN_SHAREABLE, + 0, 0, RUBY_TYPED_THREAD_SAFE_FREE | RUBY_TYPED_WB_PROTECTED | RUBY_TYPED_FROZEN_SHAREABLE, }; /* diff --git a/ext/openssl/ossl_cipher.c b/ext/openssl/ossl_cipher.c index bed30ae3d47c86..f51e38113f953b 100644 --- a/ext/openssl/ossl_cipher.c +++ b/ext/openssl/ossl_cipher.c @@ -40,7 +40,7 @@ static const rb_data_type_t ossl_cipher_type = { { 0, ossl_cipher_free, }, - 0, 0, RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED, + 0, 0, RUBY_TYPED_THREAD_SAFE_FREE | RUBY_TYPED_WB_PROTECTED, }; #ifdef OSSL_USE_PROVIDER @@ -57,7 +57,7 @@ static const rb_data_type_t ossl_evp_cipher_holder_type = { { .dfree = ossl_evp_cipher_free, }, - 0, 0, RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED, + 0, 0, RUBY_TYPED_THREAD_SAFE_FREE | RUBY_TYPED_WB_PROTECTED, }; #endif diff --git a/ext/openssl/ossl_config.c b/ext/openssl/ossl_config.c index 274875a97830d0..2e7814baa28803 100644 --- a/ext/openssl/ossl_config.c +++ b/ext/openssl/ossl_config.c @@ -22,7 +22,7 @@ static const rb_data_type_t ossl_config_type = { { 0, nconf_free, }, - 0, 0, RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED | RUBY_TYPED_FROZEN_SHAREABLE, + 0, 0, RUBY_TYPED_THREAD_SAFE_FREE | RUBY_TYPED_WB_PROTECTED | RUBY_TYPED_FROZEN_SHAREABLE, }; CONF * diff --git a/ext/openssl/ossl_digest.c b/ext/openssl/ossl_digest.c index e23968b1e325ef..0d6a99c3165cbd 100644 --- a/ext/openssl/ossl_digest.c +++ b/ext/openssl/ossl_digest.c @@ -36,7 +36,7 @@ static const rb_data_type_t ossl_digest_type = { { 0, ossl_digest_free, }, - 0, 0, RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED, + 0, 0, RUBY_TYPED_THREAD_SAFE_FREE | RUBY_TYPED_WB_PROTECTED, }; #ifdef OSSL_USE_PROVIDER @@ -53,7 +53,7 @@ static const rb_data_type_t ossl_evp_md_holder_type = { { .dfree = ossl_evp_md_free, }, - 0, 0, RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED, + 0, 0, RUBY_TYPED_THREAD_SAFE_FREE | RUBY_TYPED_WB_PROTECTED, }; #endif diff --git a/ext/openssl/ossl_engine.c b/ext/openssl/ossl_engine.c index a2bcb07ea47d73..2ff44456a7e1fd 100644 --- a/ext/openssl/ossl_engine.c +++ b/ext/openssl/ossl_engine.c @@ -68,7 +68,7 @@ static const rb_data_type_t ossl_engine_type = { { 0, ossl_engine_free, }, - 0, 0, RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED, + 0, 0, RUBY_TYPED_THREAD_SAFE_FREE | RUBY_TYPED_WB_PROTECTED, }; /* diff --git a/ext/openssl/ossl_hmac.c b/ext/openssl/ossl_hmac.c index ddcc6a5f8d0d3a..1bb72431acd6e9 100644 --- a/ext/openssl/ossl_hmac.c +++ b/ext/openssl/ossl_hmac.c @@ -43,7 +43,7 @@ static const rb_data_type_t ossl_hmac_type = { { 0, ossl_hmac_free, }, - 0, 0, RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED, + 0, 0, RUBY_TYPED_THREAD_SAFE_FREE | RUBY_TYPED_WB_PROTECTED, }; static VALUE diff --git a/ext/openssl/ossl_hpke.c b/ext/openssl/ossl_hpke.c index b1e915ed648810..c492882807daf8 100644 --- a/ext/openssl/ossl_hpke.c +++ b/ext/openssl/ossl_hpke.c @@ -78,7 +78,7 @@ static const rb_data_type_t ossl_hpke_ctx_type = { { 0, ossl_hpke_ctx_free, }, - 0, 0, RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED, + 0, 0, RUBY_TYPED_THREAD_SAFE_FREE | RUBY_TYPED_WB_PROTECTED, }; #define GetHpkeSuite(obj, suite) do {\ @@ -105,7 +105,7 @@ static const rb_data_type_t ossl_hpke_suite_type = { { 0, ossl_hpke_suite_free, ossl_hpke_suite_memsize, }, - 0, 0, RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED, + 0, 0, RUBY_TYPED_THREAD_SAFE_FREE | RUBY_TYPED_WB_PROTECTED, }; /* diff --git a/ext/openssl/ossl_ns_spki.c b/ext/openssl/ossl_ns_spki.c index eb4fce59611400..96e9dc86006148 100644 --- a/ext/openssl/ossl_ns_spki.c +++ b/ext/openssl/ossl_ns_spki.c @@ -42,7 +42,7 @@ static const rb_data_type_t ossl_netscape_spki_type = { { 0, ossl_netscape_spki_free, }, - 0, 0, RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED, + 0, 0, RUBY_TYPED_THREAD_SAFE_FREE | RUBY_TYPED_WB_PROTECTED, }; static VALUE diff --git a/ext/openssl/ossl_ocsp.c b/ext/openssl/ossl_ocsp.c index 150e75326d966f..5a204a0b9ab2de 100644 --- a/ext/openssl/ossl_ocsp.c +++ b/ext/openssl/ossl_ocsp.c @@ -52,7 +52,7 @@ static const rb_data_type_t ossl_ocsp_request_type = { { 0, ossl_ocsp_request_free, }, - 0, 0, RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED, + 0, 0, RUBY_TYPED_THREAD_SAFE_FREE | RUBY_TYPED_WB_PROTECTED, }; static void @@ -66,7 +66,7 @@ static const rb_data_type_t ossl_ocsp_response_type = { { 0, ossl_ocsp_response_free, }, - 0, 0, RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED, + 0, 0, RUBY_TYPED_THREAD_SAFE_FREE | RUBY_TYPED_WB_PROTECTED, }; static void @@ -80,7 +80,7 @@ static const rb_data_type_t ossl_ocsp_basicresp_type = { { 0, ossl_ocsp_basicresp_free, }, - 0, 0, RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED, + 0, 0, RUBY_TYPED_THREAD_SAFE_FREE | RUBY_TYPED_WB_PROTECTED, }; static void @@ -94,7 +94,7 @@ static const rb_data_type_t ossl_ocsp_singleresp_type = { { 0, ossl_ocsp_singleresp_free, }, - 0, 0, RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED, + 0, 0, RUBY_TYPED_THREAD_SAFE_FREE | RUBY_TYPED_WB_PROTECTED, }; static void @@ -108,7 +108,7 @@ static const rb_data_type_t ossl_ocsp_certid_type = { { 0, ossl_ocsp_certid_free, }, - 0, 0, RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED, + 0, 0, RUBY_TYPED_THREAD_SAFE_FREE | RUBY_TYPED_WB_PROTECTED, }; /* diff --git a/ext/openssl/ossl_pkcs12.c b/ext/openssl/ossl_pkcs12.c index da8fd1c3bff8a2..b43ab972c96737 100644 --- a/ext/openssl/ossl_pkcs12.c +++ b/ext/openssl/ossl_pkcs12.c @@ -36,7 +36,7 @@ static const rb_data_type_t ossl_pkcs12_type = { { 0, ossl_pkcs12_free, }, - 0, 0, RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED, + 0, 0, RUBY_TYPED_THREAD_SAFE_FREE | RUBY_TYPED_WB_PROTECTED, }; static VALUE diff --git a/ext/openssl/ossl_pkcs7.c b/ext/openssl/ossl_pkcs7.c index aed950a5c64146..e17a4941006db0 100644 --- a/ext/openssl/ossl_pkcs7.c +++ b/ext/openssl/ossl_pkcs7.c @@ -55,7 +55,7 @@ static const rb_data_type_t ossl_pkcs7_type = { { 0, ossl_pkcs7_free, }, - 0, 0, RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED, + 0, 0, RUBY_TYPED_THREAD_SAFE_FREE | RUBY_TYPED_WB_PROTECTED, }; static VALUE @@ -89,7 +89,7 @@ static const rb_data_type_t ossl_pkcs7_signer_info_type = { { 0, ossl_pkcs7_signer_info_free, }, - 0, 0, RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED, + 0, 0, RUBY_TYPED_THREAD_SAFE_FREE | RUBY_TYPED_WB_PROTECTED, }; static void @@ -103,7 +103,7 @@ static const rb_data_type_t ossl_pkcs7_recip_info_type = { { 0, ossl_pkcs7_recip_info_free, }, - 0, 0, RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED, + 0, 0, RUBY_TYPED_THREAD_SAFE_FREE | RUBY_TYPED_WB_PROTECTED, }; /* diff --git a/ext/openssl/ossl_pkey.c b/ext/openssl/ossl_pkey.c index 7528d2d2638f34..0ca3746a113f5d 100644 --- a/ext/openssl/ossl_pkey.c +++ b/ext/openssl/ossl_pkey.c @@ -35,7 +35,7 @@ const rb_data_type_t ossl_evp_pkey_type = { { 0, ossl_evp_pkey_free, }, - 0, 0, RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED, + 0, 0, RUBY_TYPED_THREAD_SAFE_FREE | RUBY_TYPED_WB_PROTECTED, }; static VALUE diff --git a/ext/openssl/ossl_pkey_ec.c b/ext/openssl/ossl_pkey_ec.c index 9e059a406ce569..2a5d51ec217daf 100644 --- a/ext/openssl/ossl_pkey_ec.c +++ b/ext/openssl/ossl_pkey_ec.c @@ -587,7 +587,7 @@ static const rb_data_type_t ossl_ec_group_type = { { 0, ossl_ec_group_free, }, - 0, 0, RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED, + 0, 0, RUBY_TYPED_THREAD_SAFE_FREE | RUBY_TYPED_WB_PROTECTED, }; static VALUE @@ -1169,7 +1169,7 @@ static const rb_data_type_t ossl_ec_point_type = { { 0, ossl_ec_point_free, }, - 0, 0, RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED, + 0, 0, RUBY_TYPED_THREAD_SAFE_FREE | RUBY_TYPED_WB_PROTECTED, }; static VALUE diff --git a/ext/openssl/ossl_provider.c b/ext/openssl/ossl_provider.c index 5cc4bc90f0e2f2..b2d5c72a8ed703 100644 --- a/ext/openssl/ossl_provider.c +++ b/ext/openssl/ossl_provider.c @@ -17,7 +17,7 @@ static const rb_data_type_t ossl_provider_type = { { 0, }, - 0, 0, RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED, + 0, 0, RUBY_TYPED_THREAD_SAFE_FREE | RUBY_TYPED_WB_PROTECTED, }; /* diff --git a/ext/openssl/ossl_ssl.c b/ext/openssl/ossl_ssl.c index 91aadf0b6e0b30..90d316004800c5 100644 --- a/ext/openssl/ossl_ssl.c +++ b/ext/openssl/ossl_ssl.c @@ -83,7 +83,7 @@ static const rb_data_type_t ossl_sslctx_type = { .dfree = ossl_sslctx_free, .dcompact = ossl_sslctx_compact, }, - .flags = RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED, + .flags = RUBY_TYPED_THREAD_SAFE_FREE | RUBY_TYPED_WB_PROTECTED, }; static VALUE @@ -1632,7 +1632,7 @@ const rb_data_type_t ossl_ssl_type = { .dfree = ossl_ssl_free, .dcompact = ossl_ssl_compact, }, - .flags = RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED, + .flags = RUBY_TYPED_THREAD_SAFE_FREE | RUBY_TYPED_WB_PROTECTED, }; static VALUE diff --git a/ext/openssl/ossl_ssl_session.c b/ext/openssl/ossl_ssl_session.c index 2a33b2f20dfebc..39dabf4a19e0b7 100644 --- a/ext/openssl/ossl_ssl_session.c +++ b/ext/openssl/ossl_ssl_session.c @@ -19,7 +19,7 @@ const rb_data_type_t ossl_ssl_session_type = { { 0, ossl_ssl_session_free, }, - 0, 0, RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED, + 0, 0, RUBY_TYPED_THREAD_SAFE_FREE | RUBY_TYPED_WB_PROTECTED, }; static VALUE ossl_ssl_session_alloc(VALUE klass) diff --git a/ext/openssl/ossl_ts.c b/ext/openssl/ossl_ts.c index bddece098517ce..9be188e45a69ae 100644 --- a/ext/openssl/ossl_ts.c +++ b/ext/openssl/ossl_ts.c @@ -59,7 +59,7 @@ static const rb_data_type_t ossl_ts_req_type = { { 0, ossl_ts_req_free, }, - 0, 0, RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED, + 0, 0, RUBY_TYPED_THREAD_SAFE_FREE | RUBY_TYPED_WB_PROTECTED, }; static void @@ -73,7 +73,7 @@ static const rb_data_type_t ossl_ts_resp_type = { { 0, ossl_ts_resp_free, }, - 0, 0, RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED, + 0, 0, RUBY_TYPED_THREAD_SAFE_FREE | RUBY_TYPED_WB_PROTECTED, }; static void @@ -87,7 +87,7 @@ static const rb_data_type_t ossl_ts_token_info_type = { { 0, ossl_ts_token_info_free, }, - 0, 0, RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED, + 0, 0, RUBY_TYPED_THREAD_SAFE_FREE | RUBY_TYPED_WB_PROTECTED, }; static VALUE diff --git a/ext/openssl/ossl_x509attr.c b/ext/openssl/ossl_x509attr.c index c84f607e3ae194..270b28bb2866e4 100644 --- a/ext/openssl/ossl_x509attr.c +++ b/ext/openssl/ossl_x509attr.c @@ -33,7 +33,7 @@ static const rb_data_type_t ossl_x509attr_type = { { 0, ossl_x509attr_free, }, - 0, 0, RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED, + 0, 0, RUBY_TYPED_THREAD_SAFE_FREE | RUBY_TYPED_WB_PROTECTED, }; static VALUE diff --git a/ext/openssl/ossl_x509cert.c b/ext/openssl/ossl_x509cert.c index f0a3a81578b321..e27cfdb5ae32dc 100644 --- a/ext/openssl/ossl_x509cert.c +++ b/ext/openssl/ossl_x509cert.c @@ -33,7 +33,7 @@ static const rb_data_type_t ossl_x509_type = { { 0, ossl_x509_free, }, - 0, 0, RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED, + 0, 0, RUBY_TYPED_THREAD_SAFE_FREE | RUBY_TYPED_WB_PROTECTED, }; static VALUE diff --git a/ext/openssl/ossl_x509crl.c b/ext/openssl/ossl_x509crl.c index 4e6c359cb198aa..d3d988d9d13511 100644 --- a/ext/openssl/ossl_x509crl.c +++ b/ext/openssl/ossl_x509crl.c @@ -33,7 +33,7 @@ static const rb_data_type_t ossl_x509crl_type = { { 0, ossl_x509crl_free, }, - 0, 0, RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED, + 0, 0, RUBY_TYPED_THREAD_SAFE_FREE | RUBY_TYPED_WB_PROTECTED, }; static VALUE diff --git a/ext/openssl/ossl_x509ext.c b/ext/openssl/ossl_x509ext.c index effc6b82902781..e232b09eebdb68 100644 --- a/ext/openssl/ossl_x509ext.c +++ b/ext/openssl/ossl_x509ext.c @@ -47,7 +47,7 @@ static const rb_data_type_t ossl_x509ext_type = { { 0, ossl_x509ext_free, }, - 0, 0, RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED, + 0, 0, RUBY_TYPED_THREAD_SAFE_FREE | RUBY_TYPED_WB_PROTECTED, }; static VALUE @@ -102,7 +102,7 @@ static const rb_data_type_t ossl_x509extfactory_type = { { 0, ossl_x509extfactory_free, }, - 0, 0, RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED, + 0, 0, RUBY_TYPED_THREAD_SAFE_FREE | RUBY_TYPED_WB_PROTECTED, }; static VALUE diff --git a/ext/openssl/ossl_x509name.c b/ext/openssl/ossl_x509name.c index 23363b6955e51f..1c51102eb98c78 100644 --- a/ext/openssl/ossl_x509name.c +++ b/ext/openssl/ossl_x509name.c @@ -38,7 +38,7 @@ static const rb_data_type_t ossl_x509name_type = { { 0, ossl_x509name_free, }, - 0, 0, RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED, + 0, 0, RUBY_TYPED_THREAD_SAFE_FREE | RUBY_TYPED_WB_PROTECTED, }; static VALUE diff --git a/ext/openssl/ossl_x509req.c b/ext/openssl/ossl_x509req.c index fd4f588884c352..3aaf639082699f 100644 --- a/ext/openssl/ossl_x509req.c +++ b/ext/openssl/ossl_x509req.c @@ -33,7 +33,7 @@ static const rb_data_type_t ossl_x509req_type = { { 0, ossl_x509req_free, }, - 0, 0, RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED, + 0, 0, RUBY_TYPED_THREAD_SAFE_FREE | RUBY_TYPED_WB_PROTECTED, }; /* diff --git a/ext/openssl/ossl_x509revoked.c b/ext/openssl/ossl_x509revoked.c index 5eff36957472d2..0286c0cf26b2a6 100644 --- a/ext/openssl/ossl_x509revoked.c +++ b/ext/openssl/ossl_x509revoked.c @@ -33,7 +33,7 @@ static const rb_data_type_t ossl_x509rev_type = { { 0, ossl_x509rev_free, }, - 0, 0, RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED, + 0, 0, RUBY_TYPED_THREAD_SAFE_FREE | RUBY_TYPED_WB_PROTECTED, }; static VALUE diff --git a/ext/openssl/ossl_x509store.c b/ext/openssl/ossl_x509store.c index ac07ddf78a31e3..39491d3fe2a927 100644 --- a/ext/openssl/ossl_x509store.c +++ b/ext/openssl/ossl_x509store.c @@ -130,7 +130,7 @@ static const rb_data_type_t ossl_x509store_type = { .dfree = ossl_x509store_free, .dcompact = ossl_x509store_compact, }, - .flags = RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED, + .flags = RUBY_TYPED_THREAD_SAFE_FREE | RUBY_TYPED_WB_PROTECTED, }; /* @@ -597,7 +597,7 @@ static const rb_data_type_t ossl_x509stctx_type = { .dfree = ossl_x509stctx_free, .dcompact = ossl_x509stctx_compact, }, - .flags = RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED, + .flags = RUBY_TYPED_THREAD_SAFE_FREE | RUBY_TYPED_WB_PROTECTED, }; static VALUE From 41e04ff5073daa71f99e7fd362c974d1db97083e Mon Sep 17 00:00:00 2001 From: Jean Boussier Date: Sat, 19 Sep 2026 13:02:31 +0200 Subject: [PATCH 2/4] [ruby/prism] Stop marking PM_SOURCE_FILE_NODE as static Ref: https://bugs.ruby-lang.org/issues/17593. Because `__FILE__` is currently considered a static literal, it's entirely evaluated during compilation. The problem is that ISeqs can be serialized and reloaded later, but since `__FILE__` is entirely computed during compilation, a serialized ISeq is coupled with the location of the source code. This prevent compiling the the iseq with the source in one path, and loading it later with the source in another path, which prevent bootsnap precompilation from working with some builds systems. I'm working on changing the compiler so that `__FILE__` is no longer a static value, but a hidden methodthat returns the current ISeq path. https://github.com/ruby/prism/commit/f16d852c8c --- prism/prism.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/prism/prism.c b/prism/prism.c index 2c84490dc57de7..6ade64fa8c4ec4 100644 --- a/prism/prism.c +++ b/prism/prism.c @@ -6464,7 +6464,10 @@ pm_source_file_node_create(pm_parser_t *parser, const pm_token_t *file_keyword) flags |= PM_STRING_FLAGS_MUTABLE; break; case PM_OPTIONS_FROZEN_STRING_LITERAL_ENABLED: - flags |= PM_NODE_FLAG_STATIC_LITERAL | PM_STRING_FLAGS_FROZEN; + flags |= PM_STRING_FLAGS_FROZEN; + if (parser->version < PM_OPTIONS_VERSION_CRUBY_4_1) { + flags |= PM_NODE_FLAG_STATIC_LITERAL; + } break; } @@ -18227,7 +18230,7 @@ parse_case(pm_parser_t *parser, uint8_t flags, uint16_t depth) { * frozen because when clause strings are frozen. */ if (PM_NODE_TYPE_P(condition, PM_STRING_NODE)) { pm_node_flag_set(condition, PM_STRING_FLAGS_FROZEN | PM_NODE_FLAG_STATIC_LITERAL); - } else if (PM_NODE_TYPE_P(condition, PM_SOURCE_FILE_NODE)) { + } else if (PM_NODE_TYPE_P(condition, PM_SOURCE_FILE_NODE) && parser->version < PM_OPTIONS_VERSION_CRUBY_4_1) { pm_node_flag_set(condition, PM_NODE_FLAG_STATIC_LITERAL); } From f07f65b79ca87ed3485eec0f3d75d7c1349329cb Mon Sep 17 00:00:00 2001 From: Kevin Newton Date: Mon, 21 Sep 2026 11:25:46 -0400 Subject: [PATCH 3/4] [PRISM] Source file no longer static literal --- prism_compile.c | 5 ----- 1 file changed, 5 deletions(-) diff --git a/prism_compile.c b/prism_compile.c index 9f79a2b1a39843..fef1f805c61b8f 100644 --- a/prism_compile.c +++ b/prism_compile.c @@ -920,10 +920,6 @@ pm_static_literal_value(rb_iseq_t *iseq, const pm_node_t *node, pm_scope_node_t } case PM_SOURCE_ENCODING_NODE: return rb_enc_from_encoding(scope_node->encoding); - case PM_SOURCE_FILE_NODE: { - const pm_source_file_node_t *cast = (const pm_source_file_node_t *) node; - return pm_source_file_value(cast, scope_node); - } case PM_SOURCE_LINE_NODE: return INT2FIX(pm_node_line_number_cached(node, scope_node)); case PM_STRING_NODE: { @@ -7602,7 +7598,6 @@ pm_compile_case_node_dispatch(rb_iseq_t *iseq, VALUE dispatch, const pm_node_t * case PM_FALSE_NODE: case PM_INTEGER_NODE: case PM_NIL_NODE: - case PM_SOURCE_FILE_NODE: case PM_SOURCE_LINE_NODE: case PM_SYMBOL_NODE: case PM_TRUE_NODE: From 1f717ae3d6ca76015582dc610e892be1aacb905b Mon Sep 17 00:00:00 2001 From: Peter Zhu Date: Mon, 21 Sep 2026 15:28:36 +0900 Subject: [PATCH 4/4] [ruby/mmtk] Always use fixed heap for testing against NoGC https://github.com/ruby/mmtk/commit/3f94f904eb --- test/mmtk/test_configuration.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/mmtk/test_configuration.rb b/test/mmtk/test_configuration.rb index 037383a5eae7d8..24f40560aeb7d0 100644 --- a/test/mmtk/test_configuration.rb +++ b/test/mmtk/test_configuration.rb @@ -16,7 +16,7 @@ def test_MMTK_THREADS %w(NoGC MarkSweep Immix).each do |plan| define_method(:"test_MMTK_PLAN_#{plan}") do - assert_separately([{ "MMTK_PLAN" => plan }], <<~RUBY) + assert_separately([{ "MMTK_PLAN" => plan, "MMTK_HEAP_MODE" => "fixed" }], <<~RUBY) assert_equal("#{plan}", GC.config[:mmtk_plan]) RUBY end