use crate::error::Result;
use std::sync::OnceLock;
use tokio::runtime::{Builder, Runtime};
static RUNTIME: OnceLock<Runtime> = OnceLock::new();
pub fn maximize_fd_limit() -> Result<()> {
#[cfg(unix)]
{
use crate::error::TuyaError;
use log::info;
let (soft, hard) = rlimit::getrlimit(rlimit::Resource::NOFILE)
.map_err(|e| TuyaError::io_other(format!("Failed to get rlimit: {e}")))?;
if soft < hard {
rlimit::setrlimit(rlimit::Resource::NOFILE, hard, hard)
.map_err(|e| TuyaError::io_other(format!("Failed to set rlimit: {e}")))?;
info!("File descriptor limit increased from {soft} to {hard}");
}
}
Ok(())
}
pub(crate) fn get_runtime() -> &'static Runtime {
RUNTIME.get_or_init(|| {
Builder::new_multi_thread()
.enable_all()
.build()
.expect("rustuya: failed to construct background tokio runtime")
})
}
pub(crate) fn spawn<F>(future: F) -> tokio::task::JoinHandle<()>
where
F: std::future::Future<Output = ()> + Send + 'static,
{
get_runtime().spawn(future)
}