git.delta.rocks / jrsonnet / refs/commits / 7de62040eec5

difftreelog

source

crates/nix-eval/src/pool.rs1.8 KiBsourcehistory
1use std::{2	ffi::OsString,3	sync::{Arc, OnceLock},4};56use r2d2::Pool;78use crate::{session::NixSessionInner, Error, NixSession, Result};910pub struct NixSessionPool(Pool<NixSessionPoolInner>);11impl NixSessionPool {12	pub async fn new(flake: OsString, nix_args: Vec<OsString>, nix_system: String) -> Result<Self> {13		let inner = tokio::task::block_in_place(|| {14			r2d2::Builder::<NixSessionPoolInner>::new()15				.min_idle(Some(0))16				.build(NixSessionPoolInner {17					flake,18					nix_args,19					nix_system,20				})21		})?;22		Ok(Self(inner))23	}24	pub async fn get(&self) -> Result<NixSession> {25		let v = tokio::task::block_in_place(|| self.0.get())?;26		Ok(NixSession(Arc::new(tokio::sync::Mutex::new(v))))27	}28}2930pub(crate) struct NixSessionPoolInner {31	flake: OsString,32	nix_args: Vec<OsString>,33	pub(crate) nix_system: String,34}3536impl r2d2::ManageConnection for NixSessionPoolInner {37	type Connection = NixSessionInner;38	type Error = Error;39	fn connect(&self) -> std::result::Result<Self::Connection, Self::Error> {40		let _v = TOKIO_RUNTIME41			.get()42			.expect("missed tokio runtime init!")43			.enter();44		Ok(futures::executor::block_on(NixSessionInner::new(45			self.flake.as_os_str(),46			self.nix_args.iter().map(OsString::as_os_str),47			self.nix_system.clone(),48		))?)49	}5051	fn is_valid(&self, conn: &mut Self::Connection) -> std::result::Result<(), Self::Error> {52		let _v = TOKIO_RUNTIME53			.get()54			.expect("missed tokio runtime init!")55			.enter();56		let res = futures::executor::block_on(conn.execute_expression_number("2 + 2"))?;57		if res != 4 {58			// just in case, should fail much earlier59			return Err(Error::SessionInit("misbehaving session"));60		};61		Ok(())62	}6364	fn has_broken(&self, _conn: &mut Self::Connection) -> bool {65		false66	}67}68pub static TOKIO_RUNTIME: OnceLock<tokio::runtime::Handle> = OnceLock::new();