From b94cbb8f16f9b9ced3f2fd044393117c60959c26 Mon Sep 17 00:00:00 2001 From: Wolfgang Bumiller Date: Tue, 25 Jul 2023 13:31:34 +0200 Subject: [PATCH] macro: ensure bootstrap functions happen only once Signed-off-by: Wolfgang Bumiller --- perlmod-macro/src/package.rs | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/perlmod-macro/src/package.rs b/perlmod-macro/src/package.rs index 313f6a4..711460a 100644 --- a/perlmod-macro/src/package.rs +++ b/perlmod-macro/src/package.rs @@ -104,8 +104,7 @@ impl Package { }); } - let bootstrap_name = - format!("boot_{}", self.attrs.package_name).replace("::", "__"); + let bootstrap_name = format!("boot_{}", self.attrs.package_name).replace("::", "__"); let bootstrap_ident = Ident::new(&bootstrap_name, Span::call_site()); quote! { @@ -113,14 +112,17 @@ impl Package { pub extern "C" fn #bootstrap_ident( _cv: &::perlmod::ffi::CV, ) { - unsafe { - use ::perlmod::ffi::RSPL_newXS_flags; + static ONCE: ::std::sync::Once = ::std::sync::Once::new(); + ONCE.call_once(|| { + unsafe { + use ::perlmod::ffi::RSPL_newXS_flags; - let argmark = ::perlmod::ffi::pop_arg_mark(); - argmark.set_stack(); + let argmark = ::perlmod::ffi::pop_arg_mark(); + argmark.set_stack(); - #newxs - } + #newxs + } + }); } } }