extern crate alloc;
use alloc::sync::Arc;
use spin::Mutex;
use tracing_core::span::{Attributes, Id, Record};
use tracing_core::subscriber::Subscriber;
use tracing_core::{Event, LevelFilter, Metadata};
use crate::state::GuestState;
pub(crate) struct GuestSubscriber {
state: Arc<Mutex<GuestState>>,
max_log_level: LevelFilter,
}
impl GuestSubscriber {
pub(crate) fn new(guest_start_tsc: u64, filter: LevelFilter) -> Self {
Self {
state: Arc::new(Mutex::new(GuestState::new(guest_start_tsc))),
max_log_level: filter,
}
}
pub(crate) fn state(&self) -> &Arc<Mutex<GuestState>> {
&self.state
}
}
impl Subscriber for GuestSubscriber {
fn enabled(&self, md: &Metadata<'_>) -> bool {
md.level() <= &self.max_log_level
}
fn new_span(&self, attrs: &Attributes<'_>) -> Id {
let mut state = self
.state
.try_lock()
.expect("guest_tracing: Unable to lock guest tracing state in `new_span`");
state.new_span(attrs)
}
fn record(&self, id: &Id, values: &Record<'_>) {
let mut state = self
.state
.try_lock()
.expect("guest_tracing: Unable to lock guest tracing state in `record`");
state.record(id, values)
}
fn event(&self, event: &Event<'_>) {
let mut state = self
.state
.try_lock()
.expect("guest_tracing: Unable to lock guest tracing state in `event`");
state.event(event)
}
fn enter(&self, id: &Id) {
let mut state = self
.state
.try_lock()
.expect("guest_tracing: Unable to lock guest tracing state in `enter`");
state.enter(id)
}
fn exit(&self, id: &Id) {
let mut state = self
.state
.try_lock()
.expect("guest_tracing: Unable to lock guest tracing state in `exit`");
state.exit(id)
}
fn try_close(&self, id: Id) -> bool {
let mut state = self
.state
.try_lock()
.expect("guest_tracing: Unable to lock guest tracing state in `try_close`");
state.try_close(id)
}
fn record_follows_from(&self, _span: &Id, _follows: &Id) {
}
}