use super::{
ModuleTls, TlsDescBinding, TlsDescRequest, TlsImageSource, TlsInfo, TlsModuleId, TlsRequest,
};
use crate::{Result, TlsError, memory::VmAddr, relocation::RelocationArch};
pub trait TlsResolver<Arch: RelocationArch>: Clone + Send + Sync + 'static {
const OVERRIDE_TLS_GET_ADDR: bool = false;
fn register(&self, info: TlsInfo, request: TlsRequest) -> Result<ModuleTls>;
fn publish(&self, source: TlsImageSource, mod_id: TlsModuleId) -> Result<()>;
fn unregister(&self, mod_id: TlsModuleId);
fn bind_tls_get_addr(&self) -> Result<VmAddr>;
#[inline]
fn bind_tlsdesc(&self, _request: TlsDescRequest) -> Result<TlsDescBinding> {
Err(TlsError::ResolverUnsupported.into())
}
}
impl<Arch: RelocationArch> TlsResolver<Arch> for () {
fn register(&self, _info: TlsInfo, _request: TlsRequest) -> Result<ModuleTls> {
Err(TlsError::ResolverUnsupported.into())
}
fn publish(&self, _source: TlsImageSource, _mod_id: TlsModuleId) -> Result<()> {
Err(TlsError::ResolverUnsupported.into())
}
fn unregister(&self, _mod_id: TlsModuleId) {
}
fn bind_tls_get_addr(&self) -> Result<VmAddr> {
Err(TlsError::ResolverUnsupported.into())
}
}