From 0d82735988a1b63151017d1edce8eb17da450a85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Garillot?= Date: Wed, 17 Jan 2024 14:01:58 -0500 Subject: [PATCH] fix: be a bit more clever with memory management --- src/public_parameters/mem_cache.rs | 15 +++++++++------ src/public_parameters/mod.rs | 4 ++-- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/src/public_parameters/mem_cache.rs b/src/public_parameters/mem_cache.rs index 3ee97dd973..bccfb13619 100644 --- a/src/public_parameters/mem_cache.rs +++ b/src/public_parameters/mem_cache.rs @@ -44,14 +44,15 @@ impl PublicParamMemCache { // This assumes: // 1. no one is mutating these params, which is reasonable if all accesses are Lurk processes, // 2. our process only reads this once, otherwise the produced Arc will leak memory. + // TODO: enforce this in a better way fn get_from_disk_cache_or_update_with< 'a, F: CurveCycleEquipped, - C: Coprocessor + 'static, - Fn: FnOnce(&Instance<'static, F, C>) -> Arc>>, + C: Coprocessor + 'a, + Fn: FnOnce(&Instance<'a, F, C>) -> Arc>>, >( &'static self, - instance: &Instance<'static, F, C>, + instance: &Instance<'a, F, C>, default: Fn, ) -> Result>>, Error> where @@ -67,10 +68,12 @@ impl PublicParamMemCache { match disk_cache.read_bytes(instance, &mut bytes) { Ok(()) => { info!("loading abomonated {}", instance.key()); - let (pp, rest) = - unsafe { decode::>>(&mut bytes).unwrap() }; + let (pp, rest) = unsafe { + decode::>>(&mut bytes).unwrap() + }; assert!(rest.is_empty()); - Ok(unsafe { Arc::from_raw(pp as *const PublicParams>) }) + let pp = unsafe { std::mem::transmute_copy::>, PublicParams>>(pp) }; + Ok(Arc::new(pp)) } Err(Error::IO(e)) => { warn!("{e}"); diff --git a/src/public_parameters/mod.rs b/src/public_parameters/mod.rs index f99f3a4e05..ae9a9ad42b 100644 --- a/src/public_parameters/mod.rs +++ b/src/public_parameters/mod.rs @@ -18,9 +18,9 @@ use crate::public_parameters::error::Error; use self::disk_cache::DiskCache; use self::instance::Instance; -pub fn public_params<'a, F: CurveCycleEquipped, C: Coprocessor + 'static>( +pub fn public_params + 'static>( instance: &Instance<'static, F, C>, -) -> Result>>, Error> +) -> Result>>, Error> where < as Engine>::Scalar as ff::PrimeField>::Repr: Abomonation, < as Engine>::Scalar as ff::PrimeField>::Repr: Abomonation,