Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,4 +19,6 @@ jobs:
- run: nix build -L .#entrace_core
- run: nix build -L .#entrace_core_lite
- run: nix build -L .#entrace_script
- run: nix develop --command bash -c "cargo semver-checks -p entrace_core"
name: semver-checks
- run: nix build -L .#entrace
2 changes: 1 addition & 1 deletion Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 2 additions & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,8 @@ members = ["example", "gui", "entrace_core", "bench", "entrace_query", "entrace_

[profile.profiling]
inherits = 'release'
debug = "line-tables-only"
debug = true

# Optimize all dependencies even in debug builds:
[profile.dev.package."*"]
opt-level = 2
2 changes: 1 addition & 1 deletion entrace_core/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
[package]
name = "entrace_core"
description = "client library for ENTRACE, a modern log viewer and observability toolkit for Rust"
version = "0.1.3"
version = "0.2.0"
edition = "2024"
license = "MIT OR Apache-2.0"
repository = "https://github.com/algorithmiker/entrace"
Expand Down
12 changes: 6 additions & 6 deletions entrace_core/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -260,9 +260,9 @@ impl<R: Refresh> IETPresentationConfig<R> {
/// See also [FileIETLogProvider::new] and [remote::load_iht_trace] for functions that read an IET trace,
/// in a safe way.
pub unsafe fn load_trace<R: Refresh + Send + 'static>(
file_path: impl AsRef<Path> + Send + 'static, config: LoadConfig<R>,
) -> Result<Box<dyn LogProvider + Send + 'static + Sync>, LoadTraceError> {
let mut file = File::open(&file_path)?;
file_path: &Path, config: LoadConfig<R>,
) -> Result<LogProviderImpl, LoadTraceError> {
let mut file = File::open(file_path)?;
let mut buf = [0; 10];
file.read_exact(&mut buf).map_err(|x| LoadTraceError::BadMagic(MagicParseError::IoError(x)))?;
let (version, ty) = parse_entrace_magic(&buf)?;
Expand All @@ -272,11 +272,11 @@ pub unsafe fn load_trace<R: Refresh + Send + 'static>(
match ty {
StorageFormat::IET => {
let provider = FileIETLogProvider::new(file, config.iht, false)?;
Ok(Box::new(provider))
Ok(LogProviderImpl::FileIET(provider))
}
StorageFormat::IETPrefix => {
let provider = FileIETLogProvider::new(file, config.iht, true)?;
Ok(Box::new(provider))
Ok(LogProviderImpl::FileIET(provider))
}
StorageFormat::ET => {
#[cfg(feature = "mmap")]
Expand All @@ -285,7 +285,7 @@ pub unsafe fn load_trace<R: Refresh + Send + 'static>(
// SAFETY: Mmap is inherently unsafe.
let provider = unsafe { MmapLogProvider::from_file(&file) }
.map_err(LoadTraceError::MmapError)?;
return Ok(Box::new(provider));
return Ok(LogProviderImpl::Mmap(provider));
}
#[allow(unreachable_code)]
Err(LoadTraceError::MmapNeeded)
Expand Down
85 changes: 84 additions & 1 deletion entrace_core/src/log_provider.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
use crate::{
Header, MetadataRefContainer,
remote::{FileIETError, RemoteLogProviderError},
remote::{
BaseIETLogProvider, FileIETError, FileIETLogProvider, RemoteLogProvider,
RemoteLogProviderError,
},
tree_layer::EnValueRef,
};

Expand Down Expand Up @@ -45,3 +48,83 @@ pub trait LogProvider {
/// as it directly affects FPS.
fn frame_callback(&mut self) {}
}

pub enum LogProviderImpl {
BaseIET(BaseIETLogProvider),
FileIET(FileIETLogProvider),
Remote(RemoteLogProvider),
#[cfg(feature = "mmap")]
Mmap(crate::mmap::MmapLogProvider),
}

impl LogProvider for LogProviderImpl {
fn children(&self, x: u32) -> Result<&[u32], LogProviderError> {
match self {
#[cfg(feature = "mmap")]
Self::Mmap(inner) => inner.children(x),
Self::BaseIET(inner) => inner.children(x),
Self::FileIET(inner) => inner.children(x),
Self::Remote(inner) => inner.children(x),
}
}

fn parent(&self, x: u32) -> Result<u32, LogProviderError> {
match self {
#[cfg(feature = "mmap")]
Self::Mmap(inner) => inner.parent(x),
Self::BaseIET(inner) => inner.parent(x),
Self::FileIET(inner) => inner.parent(x),
Self::Remote(inner) => inner.parent(x),
}
}

fn attrs(&'_ self, x: u32) -> Result<Vec<(&'_ str, EnValueRef<'_>)>, LogProviderError> {
match self {
#[cfg(feature = "mmap")]
Self::Mmap(inner) => inner.attrs(x),
Self::BaseIET(inner) => inner.attrs(x),
Self::FileIET(inner) => inner.attrs(x),
Self::Remote(inner) => inner.attrs(x),
}
}

fn header(&'_ self, x: u32) -> Result<Header<'_>, LogProviderError> {
match self {
#[cfg(feature = "mmap")]
Self::Mmap(inner) => inner.header(x),
Self::BaseIET(inner) => inner.header(x),
Self::FileIET(inner) => inner.header(x),
Self::Remote(inner) => inner.header(x),
}
}

fn meta(&'_ self, x: u32) -> Result<MetadataRefContainer<'_>, LogProviderError> {
match self {
#[cfg(feature = "mmap")]
Self::Mmap(inner) => inner.meta(x),
Self::BaseIET(inner) => inner.meta(x),
Self::FileIET(inner) => inner.meta(x),
Self::Remote(inner) => inner.meta(x),
}
}

fn len(&self) -> usize {
match self {
#[cfg(feature = "mmap")]
Self::Mmap(inner) => inner.len(),
Self::BaseIET(inner) => inner.len(),
Self::FileIET(inner) => inner.len(),
Self::Remote(inner) => inner.len(),
}
}

fn frame_callback(&mut self) {
match self {
#[cfg(feature = "mmap")]
Self::Mmap(inner) => inner.frame_callback(),
Self::BaseIET(inner) => inner.frame_callback(),
Self::FileIET(inner) => inner.frame_callback(),
Self::Remote(inner) => inner.frame_callback(),
}
}
}
2 changes: 1 addition & 1 deletion entrace_query/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ edition = "2024"

[dependencies]
mlua = { version = "0.11.0", features = ["error-send", "luajit"] }
entrace_core = { version = "0.1.1", path = "../entrace_core/" }
entrace_core = { version = "0.2.0", path = "../entrace_core/" }
anyhow = "1.0.100"
memchr = "2.7.6"
thiserror = "2.0.17"
Expand Down
3 changes: 0 additions & 3 deletions entrace_query/src/lib.rs
Original file line number Diff line number Diff line change
@@ -1,10 +1,7 @@
use entrace_core::LogProvider;

pub mod filtersets;
pub mod lua_api;
pub mod lua_value;

pub(crate) type TraceProvider = Box<dyn LogProvider + Send + Sync>;
#[derive(thiserror::Error, Debug, Clone)]
pub enum QueryError {
#[error("Index out of bounds. Tried to access element {index} of a container of size {actual}")]
Expand Down
60 changes: 11 additions & 49 deletions entrace_query/src/lua_api.rs
Original file line number Diff line number Diff line change
Expand Up @@ -15,15 +15,15 @@ use std::{

use anyhow::bail;
use entrace_core::{
EnValue, EnValueRef, LevelContainer, LogProvider, LogProviderError, LogProviderResult,
MetadataRefContainer,
EnValue, EnValueRef, LevelContainer, LogProvider, LogProviderError, LogProviderImpl,
LogProviderResult, MetadataRefContainer,
};
use memchr::memmem::Finder;
use mlua::{ExternalError, ExternalResult, IntoLua, Lua, Table, Value};
use roaring::RoaringBitmap;

use crate::{
QueryError, TraceProvider,
QueryError,
filtersets::{Filterset, Matcher, Predicate, PredicateId},
lua_value::{LuaValueRef, LuaValueRefRef},
};
Expand Down Expand Up @@ -873,33 +873,6 @@ pub fn en_filterset_materialize(
}
}

struct DynAdapter<'a>(&'a dyn LogProvider);
impl<'a> LogProvider for DynAdapter<'a> {
fn children(&self, x: u32) -> Result<&[u32], LogProviderError> {
self.0.children(x)
}

fn parent(&self, x: u32) -> Result<u32, LogProviderError> {
self.0.parent(x)
}

fn attrs(&'_ self, x: u32) -> Result<Vec<(&'_ str, EnValueRef<'_>)>, LogProviderError> {
self.0.attrs(x)
}

fn header(&'_ self, x: u32) -> Result<entrace_core::Header<'_>, LogProviderError> {
self.0.header(x)
}

fn meta(&'_ self, x: u32) -> Result<MetadataRefContainer<'_>, LogProviderError> {
self.0.meta(x)
}

fn len(&self) -> usize {
self.0.len()
}
}

pub struct JoinCtx {
is_joining: AtomicBool,
threads_joined: AtomicUsize,
Expand Down Expand Up @@ -942,7 +915,6 @@ pub fn en_join(joinable: Arc<JoinCtx>) -> impl Fn(Table) -> LogProviderResult<Ve
Ok(old_results)
}
}

macro_rules! lua_setup_with_wrappers {
($lua: expr, $trace: expr, $finder_cache: expr, $join_ctx: expr, $range: expr, $lua_wrap: ident, $lua_wrap2: ident) => {
let globals = $lua.globals();
Expand Down Expand Up @@ -1066,7 +1038,7 @@ impl LuaEvalState {
}
}
pub fn setup_lua_on_arc_rwlock(
lua: &mut Lua, trace: Arc<RwLock<TraceProvider>>, state: LuaEvalState,
lua: &mut Lua, trace: Arc<RwLock<LogProviderImpl>>, state: LuaEvalState,
) -> Result<(), mlua::Error> {
/// INPUT a Fn(impl LogProvider) -> Fn($arg) -> Result<T,E>
/// OUTPUT a Fn(Arc<RwLock<Box<dyn LogProvider>>> -> Fn(Lua, $arg) -> mlua::Result<T>
Expand All @@ -1075,8 +1047,7 @@ pub fn setup_lua_on_arc_rwlock(
let tp = $trace_provider.clone();
move |_lua: &Lua, a: $arg| {
let log = tp.read().unwrap();
let adapter = DynAdapter(&**log);
$fn(&adapter)(a).map_err(|x| x.into_lua_err())
$fn(&*log)(a).map_err(|x| x.into_lua_err())
}
}};
}
Expand All @@ -1088,8 +1059,7 @@ pub fn setup_lua_on_arc_rwlock(
let tp = $trace_provider.clone();
move |lua: &Lua, a: $arg| {
let log = tp.read().unwrap();
let adapter = DynAdapter(&**log);
$fn(&adapter, lua)(a)
$fn(&*log, lua)(a)
}
}};
}
Expand All @@ -1099,8 +1069,7 @@ pub fn setup_lua_on_arc_rwlock(
"en_contains_anywhere",
lua.create_function(move |_lua: &Lua, (id, needle): (u32, String)| {
let log = t.read().unwrap();
let adapter = DynAdapter(&**log);
en_contains_anywhere(&adapter, finder_cache.clone(), reusable_buf.clone())((id, needle))
en_contains_anywhere(&*log, finder_cache.clone(), reusable_buf.clone())((id, needle))
.map_err(to_lua_err)
})?,
)?;
Expand All @@ -1110,17 +1079,14 @@ pub fn setup_lua_on_arc_rwlock(
}

pub fn setup_lua_no_lock(
lua: &mut Lua, trace: Arc<TraceProvider>, state: LuaEvalState,
lua: &mut Lua, trace: Arc<LogProviderImpl>, state: LuaEvalState,
) -> Result<(), mlua::Error> {
/// INPUT a Fn(impl LogProvider) -> Fn($arg) -> Result<T,E>
/// OUTPUT a Fn(Arc<RwLock<Box<dyn LogProvider>>> -> Fn(Lua, $arg) -> mlua::Result<T>
macro_rules! lua_wrap {
($trace_provider: expr, $arg: ty, $fn: expr) => {{
let tp = $trace_provider.clone();
move |_lua: &Lua, a: $arg| {
let adapter = DynAdapter(&**tp);
$fn(&adapter)(a).map_err(|x| x.into_lua_err())
}
move |_lua: &Lua, a: $arg| $fn(&*tp)(a).map_err(|x| x.into_lua_err())
}};
}

Expand All @@ -1129,19 +1095,15 @@ pub fn setup_lua_no_lock(
macro_rules! lua_wrap2 {
($trace_provider: expr, $arg: ty, $fn: expr) => {{
let tp = $trace_provider.clone();
move |lua: &Lua, a: $arg| {
let adapter = DynAdapter(&**tp);
$fn(&adapter, lua)(a)
}
move |lua: &Lua, a: $arg| $fn(&*tp, lua)(a)
}};
}
let LuaEvalState { join_ctx, range, finder_cache, reusable_buf } = state;
let t = trace.clone();
lua.globals().set(
"en_contains_anywhere",
lua.create_function(move |_lua: &Lua, (id, needle): (u32, String)| {
let adapter = DynAdapter(&**t);
en_contains_anywhere(&adapter, finder_cache.clone(), reusable_buf.clone())((id, needle))
en_contains_anywhere(&*t, finder_cache.clone(), reusable_buf.clone())((id, needle))
.map_err(to_lua_err)
})?,
)?;
Expand Down
2 changes: 1 addition & 1 deletion entrace_script/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ edition = "2024"
clap = { version = "4.5.50", features = ["derive"] }
mlua = { version = "0.11.0", features = ["error-send", "luajit"] }
entrace_query = { version = "0.1.1", path = "../entrace_query/" }
entrace_core = { version = "0.1.1", path = "../entrace_core/" }
entrace_core = { version = "0.2.0", path = "../entrace_core/" }
anyhow = "1.0.100"

[[bin]]
Expand Down
3 changes: 2 additions & 1 deletion entrace_script/src/main.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
use entrace_core::LogProvider;
use std::{cell::RefCell, collections::HashMap, path::PathBuf, rc::Rc, sync::Arc};

use clap::Parser;
Expand All @@ -17,7 +18,7 @@ fn main() -> anyhow::Result<()> {
let Args { lua_file, trace_file } = Args::parse();
let trace = unsafe {
entrace_core::load_trace(
trace_file,
&trace_file,
entrace_core::LoadConfig {
iht: IETLoadConfig {
watch: FileWatchConfig::DontWatch,
Expand Down
2 changes: 1 addition & 1 deletion gui/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ directories = "6.0.0"
eframe = "0.33.0"
egui = "0.33.0"
egui_extras = { version = "0.33.0", features = ["svg"] }
entrace_core = { version = "0.1.1", path = "../entrace_core/" }
entrace_core = { version = "0.2.0", path = "../entrace_core/" }
entrace_query = { version = "0.1.1", path = "../entrace_query/" }
memchr = "2.7.5"
mimalloc = "0.1.47"
Expand Down
4 changes: 2 additions & 2 deletions gui/src/app.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ use egui::{
epaint::text::{FontInsert, InsertFontFamily},
};
use entrace_core::{
IETLoadConfig, IETPresentationConfig, LoadConfig,
IETLoadConfig, IETPresentationConfig, LoadConfig, LogProvider,
remote::{FileWatchConfig, NotifyExt},
};
use nucleo_matcher::{
Expand Down Expand Up @@ -155,7 +155,7 @@ impl App {
},
};
let trace = time_print("loading trace", || unsafe {
entrace_core::load_trace(path, load_config)
entrace_core::load_trace(path.as_ref(), load_config)
});
match trace {
Ok(x) => {
Expand Down
6 changes: 4 additions & 2 deletions gui/src/connection_dialog.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ use std::{

use egui::Context;
use entrace_core::{
IETPresentationConfig,
IETPresentationConfig, LogProviderImpl,
remote::{IETEvent, RemoteLogProvider},
};
use tracing::info;
Expand Down Expand Up @@ -80,7 +80,9 @@ pub fn connect_dialog(ctx: &Context, app: &mut App) {
let meta_open = EnBitVec::repeat(false, 1);
app.log_status = LogStatus::Ready(LogState {
file_path: PathBuf::from(&dialog.connect_url),
trace_provider: Arc::new(RwLock::new(Box::new(provider))),
trace_provider: Arc::new(RwLock::new(LogProviderImpl::Remote(
provider,
))),
is_open,
meta_open,
locating_state: RefCell::new(LocatingState::None),
Expand Down
Loading
Loading