fix other_root_obj list containing known sections

This commit is contained in:
silverweed 2024-11-19 16:24:05 +01:00
parent ffe7dccb78
commit 16318850d6
6 changed files with 78 additions and 48 deletions

33
src/lists.h Normal file
View file

@ -0,0 +1,33 @@
#define push_to_sll(lhead, ltail, new) \
if ((ltail)) { \
assert((lhead)); \
(ltail)->next = (new); \
} else { \
assert(!(ltail)); \
(lhead) = (new); \
} \
(ltail) = (new)
#define push_to_dll(lhead, ltail, new) \
if ((ltail)) { \
assert((lhead)); \
(ltail)->next = (new); \
(new)->prev = (ltail); \
} else { \
assert(!(ltail)); \
(lhead) = (new); \
} \
(ltail) = (new)
#define pop_from_dll(lhead, ltail, popped) do { \
if ((popped)->prev) { \
(popped)->prev->next = (popped)->next; \
} else { \
(lhead) = (popped)->next; \
} \
if ((popped)->next) { \
(popped)->next->prev = (popped)->prev; \
} else { \
(ltail) = (popped)->prev; \
} \
} while (0)

View file

@ -359,33 +359,35 @@ void update_and_render(Arena *arena, App_State &app, f32 delta_time_ms)
ImGui::SameLine();
if (ImGui::Button("TKey Header")) {} // TODO: jump to next key
ImGui::ColorEdit3("_Page Start", app.viewer.col_page_start, edit_flags);
ImGui::SameLine();
if (ImGui::Button("Page Start"))
app.viewer.latest_page = viewer_jump_to_page(app, 0);
if (app.rndata.n_pages) {
ImGui::ColorEdit3("_Page Start", app.viewer.col_page_start, edit_flags);
ImGui::SameLine();
if (ImGui::Button("Page Start"))
app.viewer.latest_page = viewer_jump_to_page(app, 0);
ImGui::ColorEdit3("_Page", app.viewer.col_section[Sec_Page], edit_flags);
ImGui::SameLine();
if (ImGui::Button("Page"))
app.viewer.latest_page = viewer_jump_to_page(app, app.viewer.latest_page_gone_to);
ImGui::SameLine();
{
const i64 step_fast_i64 = app.rndata.n_pages / 100;
i64 page_to_go_to = app.viewer.latest_page_gone_to;
ImGui::PushItemWidth(100.f);
if (ImGui::InputScalar("##page_viewed", ImGuiDataType_S64, &page_to_go_to, &step_i64, &step_fast_i64, "%u") &&
ImGui::IsItemDeactivatedAfterEdit())
ImGui::ColorEdit3("_Page", app.viewer.col_section[Sec_Page], edit_flags);
ImGui::SameLine();
if (ImGui::Button("Page"))
app.viewer.latest_page = viewer_jump_to_page(app, app.viewer.latest_page_gone_to);
ImGui::SameLine();
{
app.viewer.latest_page = viewer_jump_to_page(app, page_to_go_to);
const i64 step_fast_i64 = app.rndata.n_pages / 100;
i64 page_to_go_to = app.viewer.latest_page_gone_to;
ImGui::PushItemWidth(100.f);
if (ImGui::InputScalar("##page_viewed", ImGuiDataType_S64, &page_to_go_to, &step_i64, &step_fast_i64, "%u") &&
ImGui::IsItemDeactivatedAfterEdit())
{
app.viewer.latest_page = viewer_jump_to_page(app, page_to_go_to);
}
ImGui::PopItemWidth();
}
ImGui::PopItemWidth();
ImGui::SameLine();
String8 this_page_width = app.viewer.latest_page
? push_str8f(scratch.arena, " (this page: %s)",
to_pretty_size(scratch.arena, app.viewer.latest_page->range.len).c())
: str8("");
ImGui::Text("%s%s", to_pretty_size(scratch.arena, app.rndata.tot_page_comp_size).c(), this_page_width.c());
}
ImGui::SameLine();
String8 this_page_width = app.viewer.latest_page
? push_str8f(scratch.arena, " (this page: %s)",
to_pretty_size(scratch.arena, app.viewer.latest_page->range.len).c())
: str8("");
ImGui::Text("%s%s", to_pretty_size(scratch.arena, app.rndata.tot_page_comp_size).c(), this_page_width.c());
ImGui::ColorEdit3("_Checksum", app.viewer.col_checksum, edit_flags);
ImGui::SameLine();

View file

@ -452,7 +452,7 @@ Section find_section(App_State &app, u64 off, i64 hilite_cluster = -1)
const RNTuple_Data &rdata = app.rndata;
const TKeys_Data &tdata = app.tfile_data.tkeys_data;
for (u32 i = 1; i < Sec_First_Non_Unique; ++i) {
for (u32 i = 1; i < Sec_COUNT_Non_Unique; ++i) {
const Section &sec = tdata.sections[i];
if (sec.range.start - sec.pre_size <= off && off < sec.range.end()) {
return sec;
@ -536,7 +536,7 @@ Section find_section(App_State &app, u64 off, i64 hilite_cluster = -1)
}
// Copypasted from the fast page lookup
if (tdata.other_root_obj) {
if (tdata.n_other_root_obj > 0) {
// fast case: `off` is in the same page info as previous `off`.
for (i32 i = 0; i < 2; ++i) {
const Section &other_sec = app.last_other_root_obj->section;

View file

@ -66,8 +66,8 @@ enum Section_Id {
Sec_RNTuple_Footer,
Sec_Page_List,
Sec_First_Non_Unique,
Sec_Page = Sec_First_Non_Unique,
Sec_COUNT_Non_Unique,
Sec_Page = Sec_COUNT_Non_Unique,
// any other object stored in a TKey
Sec_Other,

View file

@ -66,6 +66,7 @@ using ROOT::Experimental::Internal::RNTupleSerializer;
// Internal headers
// --------------------------------------------------
#include "types.h"
#include "lists.h"
#include "defer.h"
#include "prof.h"
#include "mem.h"

View file

@ -204,7 +204,7 @@ b8 walk_tkeys(Arena *arena, const u8 *data, u64 data_len, u32 flags, TFile_Data
++n_keys;
}
if (cur == tkeys_data.sections[Sec_TKey_List].range.start) {
if (cur == tkeys_data.sections[Sec_TKey_List].range.start - tkeys_data.sections[Sec_TKey_List].pre_size) {
if (keylen != tkeys_data.sections[Sec_TKey_List].pre_size ||
(u64)(n_bytes - keylen) != tkeys_data.sections[Sec_TKey_List].range.len)
{
@ -217,6 +217,10 @@ b8 walk_tkeys(Arena *arena, const u8 *data, u64 data_len, u32 flags, TFile_Data
tkeys_data.sections[Sec_TFile_Info].pre_size = keylen;
tkeys_data.sections[Sec_TFile_Info].range.start += keylen;
tkeys_data.sections[Sec_TFile_Info].range.len = n_bytes - keylen;
} else if (cur == tkeys_data.sections[Sec_TFile_FreeList].range.start) {
tkeys_data.sections[Sec_TFile_FreeList].pre_size = keylen;
tkeys_data.sections[Sec_TFile_FreeList].range.start += keylen;
tkeys_data.sections[Sec_TFile_FreeList].range.len = n_bytes - keylen;
} else {
// Check if this is a RNTuple anchor
u64 key_header_size = (key_version >= 1000) ? 18 + 16 : 18 + 8;
@ -271,27 +275,17 @@ b8 walk_tkeys(Arena *arena, const u8 *data, u64 data_len, u32 flags, TFile_Data
rblob_key->next = tkeys_data.rblob_keys;
tkeys_data.rblob_keys = rblob_key;
} else if ((flags & WTK_COLLECT_OTHER_ROOT_OBJS) &&
!key_has_class_name("TFile")) // @Cleanup: this is here to avoid adding stuff like the tkeys list
// or the free list to the "other root obj" list. We might instead want
// to do a later pass to remove all objects that are in a "well-known"
// section from that list.
{
Other_Root_Obj_Info *binfo = arena_push<Other_Root_Obj_Info>(arena);
} else if (flags & WTK_COLLECT_OTHER_ROOT_OBJS) {
Other_Root_Obj_Info *oth_info = arena_push<Other_Root_Obj_Info>(arena);
if (cname_len) {
binfo->class_name = str8_from_buf(arena, data + cname_off + 1, cname_len);
oth_info->class_name = str8_from_buf(arena, data + cname_off + 1, cname_len);
}
binfo->section.id = Sec_Other;
binfo->section.info = binfo;
binfo->section.range.start = cur + keylen;
binfo->section.range.len = n_bytes - keylen;
binfo->section.pre_size = keylen;
if (tkeys_data.other_root_obj) {
other_root_obj_tail->next = binfo;
} else {
tkeys_data.other_root_obj = binfo;
}
other_root_obj_tail = binfo;
oth_info->section.id = Sec_Other;
oth_info->section.info = oth_info;
oth_info->section.range.start = cur + keylen;
oth_info->section.range.len = n_bytes - keylen;
oth_info->section.pre_size = keylen;
push_to_sll(tkeys_data.other_root_obj, other_root_obj_tail, oth_info);
tkeys_data.n_other_root_obj++;
}
}
@ -301,7 +295,7 @@ b8 walk_tkeys(Arena *arena, const u8 *data, u64 data_len, u32 flags, TFile_Data
if (flags & WTK_PRINT_KEYS_INFO)
printf("Found %u TKeys.\n", n_keys);
for (u32 id = 1; id < Sec_COUNT; ++id)
for (u32 id = 1; id < Sec_COUNT_Non_Unique; ++id)
tkeys_data.sections[id].id = (Section_Id)id;
// adjust header section padding