use crate::LLamaCppError;
use std::sync::atomic::AtomicBool;
use std::sync::atomic::Ordering::SeqCst;
#[derive(Eq, PartialEq, Debug)]
pub struct LlamaBackend {}
static LLAMA_BACKEND_INITIALIZED: AtomicBool = AtomicBool::new(false);
impl LlamaBackend {
fn mark_init() -> crate::Result<()> {
match LLAMA_BACKEND_INITIALIZED.compare_exchange(false, true, SeqCst, SeqCst) {
Ok(_) => Ok(()),
Err(_) => Err(LLamaCppError::BackendAlreadyInitialized),
}
}
#[tracing::instrument(skip_all)]
pub fn init() -> crate::Result<LlamaBackend> {
Self::mark_init()?;
unsafe { llama_cpp_sys_2::llama_backend_init(false) }
Ok(LlamaBackend {})
}
#[tracing::instrument(skip_all)]
pub fn init_numa() -> crate::Result<LlamaBackend> {
Self::mark_init()?;
unsafe { llama_cpp_sys_2::llama_backend_init(true) }
Ok(LlamaBackend {})
}
}
impl Drop for LlamaBackend {
fn drop(&mut self) {
match LLAMA_BACKEND_INITIALIZED.compare_exchange(true, false, SeqCst, SeqCst) {
Ok(_) => {}
Err(_) => {
unreachable!("This should not be reachable as the only ways to obtain a llama backend involve marking the backend as initialized.")
}
}
unsafe { llama_cpp_sys_2::llama_backend_free() }
}
}