Skip to content

Commit d9fd8ef

Browse files
committed
entrace_core: enum dispatch instead of dynamic.
1 parent 0783d6e commit d9fd8ef

13 files changed

Lines changed: 116 additions & 79 deletions

File tree

Cargo.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@ members = ["example", "gui", "entrace_core", "bench", "entrace_query", "entrace_
44

55
[profile.profiling]
66
inherits = 'release'
7-
debug = "line-tables-only"
7+
debug = true
8+
89
# Optimize all dependencies even in debug builds:
910
[profile.dev.package."*"]
1011
opt-level = 2

entrace_core/src/lib.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -260,9 +260,9 @@ impl<R: Refresh> IETPresentationConfig<R> {
260260
/// See also [FileIETLogProvider::new] and [remote::load_iht_trace] for functions that read an IET trace,
261261
/// in a safe way.
262262
pub unsafe fn load_trace<R: Refresh + Send + 'static>(
263-
file_path: impl AsRef<Path> + Send + 'static, config: LoadConfig<R>,
264-
) -> Result<Box<dyn LogProvider + Send + 'static + Sync>, LoadTraceError> {
265-
let mut file = File::open(&file_path)?;
263+
file_path: &Path, config: LoadConfig<R>,
264+
) -> Result<LogProviderImpl, LoadTraceError> {
265+
let mut file = File::open(file_path)?;
266266
let mut buf = [0; 10];
267267
file.read_exact(&mut buf).map_err(|x| LoadTraceError::BadMagic(MagicParseError::IoError(x)))?;
268268
let (version, ty) = parse_entrace_magic(&buf)?;
@@ -272,11 +272,11 @@ pub unsafe fn load_trace<R: Refresh + Send + 'static>(
272272
match ty {
273273
StorageFormat::IET => {
274274
let provider = FileIETLogProvider::new(file, config.iht, false)?;
275-
Ok(Box::new(provider))
275+
Ok(LogProviderImpl::FileIET(provider))
276276
}
277277
StorageFormat::IETPrefix => {
278278
let provider = FileIETLogProvider::new(file, config.iht, true)?;
279-
Ok(Box::new(provider))
279+
Ok(LogProviderImpl::FileIET(provider))
280280
}
281281
StorageFormat::ET => {
282282
#[cfg(feature = "mmap")]
@@ -285,7 +285,7 @@ pub unsafe fn load_trace<R: Refresh + Send + 'static>(
285285
// SAFETY: Mmap is inherently unsafe.
286286
let provider = unsafe { MmapLogProvider::from_file(&file) }
287287
.map_err(LoadTraceError::MmapError)?;
288-
return Ok(Box::new(provider));
288+
return Ok(LogProviderImpl::Mmap(provider));
289289
}
290290
#[allow(unreachable_code)]
291291
Err(LoadTraceError::MmapNeeded)

entrace_core/src/log_provider.rs

Lines changed: 77 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
use crate::{
22
Header, MetadataRefContainer,
3-
remote::{FileIETError, RemoteLogProviderError},
3+
mmap::MmapLogProvider,
4+
remote::{
5+
BaseIETLogProvider, FileIETError, FileIETLogProvider, RemoteLogProvider,
6+
RemoteLogProviderError,
7+
},
48
tree_layer::EnValueRef,
59
};
610

@@ -45,3 +49,75 @@ pub trait LogProvider {
4549
/// as it directly affects FPS.
4650
fn frame_callback(&mut self) {}
4751
}
52+
53+
pub enum LogProviderImpl {
54+
Mmap(MmapLogProvider),
55+
BaseIET(BaseIETLogProvider),
56+
FileIET(FileIETLogProvider),
57+
Remote(RemoteLogProvider),
58+
}
59+
60+
impl LogProvider for LogProviderImpl {
61+
fn children(&self, x: u32) -> Result<&[u32], LogProviderError> {
62+
match self {
63+
Self::Mmap(inner) => inner.children(x),
64+
Self::BaseIET(inner) => inner.children(x),
65+
Self::FileIET(inner) => inner.children(x),
66+
Self::Remote(inner) => inner.children(x),
67+
}
68+
}
69+
70+
fn parent(&self, x: u32) -> Result<u32, LogProviderError> {
71+
match self {
72+
Self::Mmap(inner) => inner.parent(x),
73+
Self::BaseIET(inner) => inner.parent(x),
74+
Self::FileIET(inner) => inner.parent(x),
75+
Self::Remote(inner) => inner.parent(x),
76+
}
77+
}
78+
79+
fn attrs(&'_ self, x: u32) -> Result<Vec<(&'_ str, EnValueRef<'_>)>, LogProviderError> {
80+
match self {
81+
Self::Mmap(inner) => inner.attrs(x),
82+
Self::BaseIET(inner) => inner.attrs(x),
83+
Self::FileIET(inner) => inner.attrs(x),
84+
Self::Remote(inner) => inner.attrs(x),
85+
}
86+
}
87+
88+
fn header(&'_ self, x: u32) -> Result<Header<'_>, LogProviderError> {
89+
match self {
90+
Self::Mmap(inner) => inner.header(x),
91+
Self::BaseIET(inner) => inner.header(x),
92+
Self::FileIET(inner) => inner.header(x),
93+
Self::Remote(inner) => inner.header(x),
94+
}
95+
}
96+
97+
fn meta(&'_ self, x: u32) -> Result<MetadataRefContainer<'_>, LogProviderError> {
98+
match self {
99+
Self::Mmap(inner) => inner.meta(x),
100+
Self::BaseIET(inner) => inner.meta(x),
101+
Self::FileIET(inner) => inner.meta(x),
102+
Self::Remote(inner) => inner.meta(x),
103+
}
104+
}
105+
106+
fn len(&self) -> usize {
107+
match self {
108+
Self::Mmap(inner) => inner.len(),
109+
Self::BaseIET(inner) => inner.len(),
110+
Self::FileIET(inner) => inner.len(),
111+
Self::Remote(inner) => inner.len(),
112+
}
113+
}
114+
115+
fn frame_callback(&mut self) {
116+
match self {
117+
Self::Mmap(inner) => inner.frame_callback(),
118+
Self::BaseIET(inner) => inner.frame_callback(),
119+
Self::FileIET(inner) => inner.frame_callback(),
120+
Self::Remote(inner) => inner.frame_callback(),
121+
}
122+
}
123+
}

entrace_query/src/lib.rs

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,7 @@
1-
use entrace_core::LogProvider;
2-
31
pub mod filtersets;
42
pub mod lua_api;
53
pub mod lua_value;
64

7-
pub(crate) type TraceProvider = Box<dyn LogProvider + Send + Sync>;
85
#[derive(thiserror::Error, Debug, Clone)]
96
pub enum QueryError {
107
#[error("Index out of bounds. Tried to access element {index} of a container of size {actual}")]

entrace_query/src/lua_api.rs

Lines changed: 11 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,15 @@ use std::{
1515

1616
use anyhow::bail;
1717
use entrace_core::{
18-
EnValue, EnValueRef, LevelContainer, LogProvider, LogProviderError, LogProviderResult,
19-
MetadataRefContainer,
18+
EnValue, EnValueRef, LevelContainer, LogProvider, LogProviderError, LogProviderImpl,
19+
LogProviderResult, MetadataRefContainer,
2020
};
2121
use memchr::memmem::Finder;
2222
use mlua::{ExternalError, ExternalResult, IntoLua, Lua, Table, Value};
2323
use roaring::RoaringBitmap;
2424

2525
use crate::{
26-
QueryError, TraceProvider,
26+
QueryError,
2727
filtersets::{Filterset, Matcher, Predicate, PredicateId},
2828
lua_value::{LuaValueRef, LuaValueRefRef},
2929
};
@@ -873,33 +873,6 @@ pub fn en_filterset_materialize(
873873
}
874874
}
875875

876-
struct DynAdapter<'a>(&'a dyn LogProvider);
877-
impl<'a> LogProvider for DynAdapter<'a> {
878-
fn children(&self, x: u32) -> Result<&[u32], LogProviderError> {
879-
self.0.children(x)
880-
}
881-
882-
fn parent(&self, x: u32) -> Result<u32, LogProviderError> {
883-
self.0.parent(x)
884-
}
885-
886-
fn attrs(&'_ self, x: u32) -> Result<Vec<(&'_ str, EnValueRef<'_>)>, LogProviderError> {
887-
self.0.attrs(x)
888-
}
889-
890-
fn header(&'_ self, x: u32) -> Result<entrace_core::Header<'_>, LogProviderError> {
891-
self.0.header(x)
892-
}
893-
894-
fn meta(&'_ self, x: u32) -> Result<MetadataRefContainer<'_>, LogProviderError> {
895-
self.0.meta(x)
896-
}
897-
898-
fn len(&self) -> usize {
899-
self.0.len()
900-
}
901-
}
902-
903876
pub struct JoinCtx {
904877
is_joining: AtomicBool,
905878
threads_joined: AtomicUsize,
@@ -942,7 +915,6 @@ pub fn en_join(joinable: Arc<JoinCtx>) -> impl Fn(Table) -> LogProviderResult<Ve
942915
Ok(old_results)
943916
}
944917
}
945-
946918
macro_rules! lua_setup_with_wrappers {
947919
($lua: expr, $trace: expr, $finder_cache: expr, $join_ctx: expr, $range: expr, $lua_wrap: ident, $lua_wrap2: ident) => {
948920
let globals = $lua.globals();
@@ -1066,7 +1038,7 @@ impl LuaEvalState {
10661038
}
10671039
}
10681040
pub fn setup_lua_on_arc_rwlock(
1069-
lua: &mut Lua, trace: Arc<RwLock<TraceProvider>>, state: LuaEvalState,
1041+
lua: &mut Lua, trace: Arc<RwLock<LogProviderImpl>>, state: LuaEvalState,
10701042
) -> Result<(), mlua::Error> {
10711043
/// INPUT a Fn(impl LogProvider) -> Fn($arg) -> Result<T,E>
10721044
/// OUTPUT a Fn(Arc<RwLock<Box<dyn LogProvider>>> -> Fn(Lua, $arg) -> mlua::Result<T>
@@ -1075,8 +1047,7 @@ pub fn setup_lua_on_arc_rwlock(
10751047
let tp = $trace_provider.clone();
10761048
move |_lua: &Lua, a: $arg| {
10771049
let log = tp.read().unwrap();
1078-
let adapter = DynAdapter(&**log);
1079-
$fn(&adapter)(a).map_err(|x| x.into_lua_err())
1050+
$fn(&*log)(a).map_err(|x| x.into_lua_err())
10801051
}
10811052
}};
10821053
}
@@ -1088,8 +1059,7 @@ pub fn setup_lua_on_arc_rwlock(
10881059
let tp = $trace_provider.clone();
10891060
move |lua: &Lua, a: $arg| {
10901061
let log = tp.read().unwrap();
1091-
let adapter = DynAdapter(&**log);
1092-
$fn(&adapter, lua)(a)
1062+
$fn(&*log, lua)(a)
10931063
}
10941064
}};
10951065
}
@@ -1099,8 +1069,7 @@ pub fn setup_lua_on_arc_rwlock(
10991069
"en_contains_anywhere",
11001070
lua.create_function(move |_lua: &Lua, (id, needle): (u32, String)| {
11011071
let log = t.read().unwrap();
1102-
let adapter = DynAdapter(&**log);
1103-
en_contains_anywhere(&adapter, finder_cache.clone(), reusable_buf.clone())((id, needle))
1072+
en_contains_anywhere(&*log, finder_cache.clone(), reusable_buf.clone())((id, needle))
11041073
.map_err(to_lua_err)
11051074
})?,
11061075
)?;
@@ -1110,17 +1079,14 @@ pub fn setup_lua_on_arc_rwlock(
11101079
}
11111080

11121081
pub fn setup_lua_no_lock(
1113-
lua: &mut Lua, trace: Arc<TraceProvider>, state: LuaEvalState,
1082+
lua: &mut Lua, trace: Arc<LogProviderImpl>, state: LuaEvalState,
11141083
) -> Result<(), mlua::Error> {
11151084
/// INPUT a Fn(impl LogProvider) -> Fn($arg) -> Result<T,E>
11161085
/// OUTPUT a Fn(Arc<RwLock<Box<dyn LogProvider>>> -> Fn(Lua, $arg) -> mlua::Result<T>
11171086
macro_rules! lua_wrap {
11181087
($trace_provider: expr, $arg: ty, $fn: expr) => {{
11191088
let tp = $trace_provider.clone();
1120-
move |_lua: &Lua, a: $arg| {
1121-
let adapter = DynAdapter(&**tp);
1122-
$fn(&adapter)(a).map_err(|x| x.into_lua_err())
1123-
}
1089+
move |_lua: &Lua, a: $arg| $fn(&*tp)(a).map_err(|x| x.into_lua_err())
11241090
}};
11251091
}
11261092

@@ -1129,19 +1095,15 @@ pub fn setup_lua_no_lock(
11291095
macro_rules! lua_wrap2 {
11301096
($trace_provider: expr, $arg: ty, $fn: expr) => {{
11311097
let tp = $trace_provider.clone();
1132-
move |lua: &Lua, a: $arg| {
1133-
let adapter = DynAdapter(&**tp);
1134-
$fn(&adapter, lua)(a)
1135-
}
1098+
move |lua: &Lua, a: $arg| $fn(&*tp, lua)(a)
11361099
}};
11371100
}
11381101
let LuaEvalState { join_ctx, range, finder_cache, reusable_buf } = state;
11391102
let t = trace.clone();
11401103
lua.globals().set(
11411104
"en_contains_anywhere",
11421105
lua.create_function(move |_lua: &Lua, (id, needle): (u32, String)| {
1143-
let adapter = DynAdapter(&**t);
1144-
en_contains_anywhere(&adapter, finder_cache.clone(), reusable_buf.clone())((id, needle))
1106+
en_contains_anywhere(&*t, finder_cache.clone(), reusable_buf.clone())((id, needle))
11451107
.map_err(to_lua_err)
11461108
})?,
11471109
)?;

entrace_script/src/main.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
use entrace_core::LogProvider;
12
use std::{cell::RefCell, collections::HashMap, path::PathBuf, rc::Rc, sync::Arc};
23

34
use clap::Parser;
@@ -17,7 +18,7 @@ fn main() -> anyhow::Result<()> {
1718
let Args { lua_file, trace_file } = Args::parse();
1819
let trace = unsafe {
1920
entrace_core::load_trace(
20-
trace_file,
21+
&trace_file,
2122
entrace_core::LoadConfig {
2223
iht: IETLoadConfig {
2324
watch: FileWatchConfig::DontWatch,

gui/src/app.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ use egui::{
1313
epaint::text::{FontInsert, InsertFontFamily},
1414
};
1515
use entrace_core::{
16-
IETLoadConfig, IETPresentationConfig, LoadConfig,
16+
IETLoadConfig, IETPresentationConfig, LoadConfig, LogProvider,
1717
remote::{FileWatchConfig, NotifyExt},
1818
};
1919
use nucleo_matcher::{
@@ -155,7 +155,7 @@ impl App {
155155
},
156156
};
157157
let trace = time_print("loading trace", || unsafe {
158-
entrace_core::load_trace(path, load_config)
158+
entrace_core::load_trace(path.as_ref(), load_config)
159159
});
160160
match trace {
161161
Ok(x) => {

gui/src/connection_dialog.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ use std::{
77

88
use egui::Context;
99
use entrace_core::{
10-
IETPresentationConfig,
10+
IETPresentationConfig, LogProviderImpl,
1111
remote::{IETEvent, RemoteLogProvider},
1212
};
1313
use tracing::info;
@@ -80,7 +80,9 @@ pub fn connect_dialog(ctx: &Context, app: &mut App) {
8080
let meta_open = EnBitVec::repeat(false, 1);
8181
app.log_status = LogStatus::Ready(LogState {
8282
file_path: PathBuf::from(&dialog.connect_url),
83-
trace_provider: Arc::new(RwLock::new(Box::new(provider))),
83+
trace_provider: Arc::new(RwLock::new(LogProviderImpl::Remote(
84+
provider,
85+
))),
8486
is_open,
8587
meta_open,
8688
locating_state: RefCell::new(LocatingState::None),

gui/src/homepage.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
use crate::{
2-
App, LevelRepr, LogStatus, TraceProvider, TraceReader, row_height,
2+
App, LevelRepr, LogStatus, TraceReader, row_height,
33
search::LocatingState,
44
tree::{TreeContextMut, tree_view},
55
};
66
use egui::{CollapsingHeader, Color32, Response, RichText, ScrollArea, Ui, vec2};
7-
use entrace_core::display_error_context;
7+
use entrace_core::{LogProvider, LogProviderImpl, display_error_context};
88
use std::{
99
cell::RefCell,
1010
sync::{Arc, RwLock},
@@ -24,7 +24,7 @@ impl SpanResponse {
2424
pub enum SpanContext<'a> {
2525
QueryResults {
2626
locating_state: &'a RefCell<LocatingState>,
27-
trace_provider: Arc<RwLock<TraceProvider>>,
27+
trace_provider: Arc<RwLock<LogProviderImpl>>,
2828
},
2929
}
3030

gui/src/log.rs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use std::{
66
};
77

88
use entrace_core::{
9-
LogProvider, display_error_context,
9+
LogProvider, LogProviderImpl, display_error_context,
1010
remote::{IETEvent, Notify, NotifyExt},
1111
};
1212
use tracing::{info, trace};
@@ -36,11 +36,9 @@ impl Display for LogStatus {
3636
}
3737
}
3838
}
39-
/// TODO: try to remove this box by making LogProvider Sized
40-
pub type TraceProvider = Box<dyn LogProvider + Send + Sync>;
4139
pub struct LogState {
4240
pub file_path: PathBuf,
43-
pub trace_provider: Arc<RwLock<TraceProvider>>,
41+
pub trace_provider: Arc<RwLock<LogProviderImpl>>,
4442
/// Used for culling.
4543
pub is_open: EnBitVec,
4644
pub meta_open: EnBitVec,

0 commit comments

Comments
 (0)