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, Metadata};
use crate::state::GuestState;
pub(crate) struct GuestSubscriber {
state: Arc<Mutex<GuestState>>,
}
impl GuestSubscriber {
pub(crate) fn new(guest_start_tsc: u64) -> Self {
Self {
state: Arc::new(Mutex::new(GuestState::new(guest_start_tsc))),
}
}
pub(crate) fn state(&self) -> &Arc<Mutex<GuestState>> {
&self.state
}
}
impl Subscriber for GuestSubscriber {
fn enabled(&self, _md: &Metadata<'_>) -> bool {
true
}
fn new_span(&self, attrs: &Attributes<'_>) -> Id {
self.state.lock().new_span(attrs)
}
fn record(&self, id: &Id, values: &Record<'_>) {
self.state.lock().record(id, values)
}
fn event(&self, event: &Event<'_>) {
self.state.lock().event(event)
}
fn enter(&self, id: &Id) {
self.state.lock().enter(id)
}
fn exit(&self, id: &Id) {
self.state.lock().exit(id)
}
fn try_close(&self, id: Id) -> bool {
self.state.lock().try_close(id)
}
fn record_follows_from(&self, _span: &Id, _follows: &Id) {
}
}