watch mapped file for changes
This commit is contained in:
parent
7816fda8c7
commit
d714591dc1
6 changed files with 54 additions and 19 deletions
|
@ -8,9 +8,9 @@ Size=1152,1414
|
|||
|
||||
[Window][main]
|
||||
Pos=0,0
|
||||
Size=1115,1414
|
||||
Size=1115,470
|
||||
|
||||
[Window][Hex View]
|
||||
Pos=91,62
|
||||
Size=1002,681
|
||||
Size=986,681
|
||||
|
||||
|
|
|
@ -49,6 +49,9 @@ struct App_State {
|
|||
Window_Data win_data;
|
||||
User_Input user_input;
|
||||
|
||||
u8 *inspected_file;
|
||||
FILE *inspected_file;
|
||||
u8 *inspected_fmem;
|
||||
u64 inspected_file_size;
|
||||
// @Platform: inotify file descriptor
|
||||
int inot;
|
||||
};
|
||||
|
|
|
@ -1,3 +1,12 @@
|
|||
internal
|
||||
size_t file_size(FILE *f)
|
||||
{
|
||||
fseek(f, 0, SEEK_END);
|
||||
size_t res = ftell(f);
|
||||
fseek(f, 0, SEEK_SET);
|
||||
return res;
|
||||
}
|
||||
|
||||
internal
|
||||
void monitor_key(GLFWwindow *window, u16 *key_state, i32 glfw_key, Input_Key haru_key) {
|
||||
u16& state = key_state[haru_key];
|
||||
|
@ -53,6 +62,14 @@ void run_main_loop(GLFWwindow *window, Arena *arena, App_State &app)
|
|||
ImGui_ImplGlfw_NewFrame();
|
||||
ImGui::NewFrame();
|
||||
|
||||
// Check if the inspected file changed
|
||||
{
|
||||
char buf[sizeof(inotify_event) + NAME_MAX + 1];
|
||||
ssize_t nbytes = read(app.inot, buf, sizeof(buf));
|
||||
if (nbytes)
|
||||
app.inspected_file_size = file_size(app.inspected_file);
|
||||
}
|
||||
|
||||
if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS ||
|
||||
glfwWindowShouldClose(window))
|
||||
{
|
||||
|
|
|
@ -12,18 +12,21 @@
|
|||
#define asan_unpoison_memory_region(mem, cmt)
|
||||
#endif
|
||||
|
||||
// @Platform
|
||||
internal
|
||||
void *os_reserve(u64 size)
|
||||
{
|
||||
return mmap(0, size, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
|
||||
}
|
||||
|
||||
// @Platform
|
||||
internal
|
||||
void os_release(void *mem, u64 size)
|
||||
{
|
||||
munmap(mem, size);
|
||||
}
|
||||
|
||||
// @Platform
|
||||
internal
|
||||
b32x os_commit(void *addr, u64 size)
|
||||
{
|
||||
|
|
|
@ -20,7 +20,7 @@ void update_and_render(Arena *arena, App_State &app, f32 delta_time)
|
|||
char *text_buf = arena_push_array_no_zero<char>(scratch.arena, text_buf_size + 1);
|
||||
// TODO: convert file content to human readable
|
||||
for (u64 i = 0; i < text_buf_size / 2; ++i)
|
||||
sprintf(&text_buf[2 * i], "%02X", app.inspected_file[i]);
|
||||
sprintf(&text_buf[2 * i], "%02X", app.inspected_fmem[i]);
|
||||
text_buf[text_buf_size] = 0;
|
||||
|
||||
if (ImGui::Begin("main")) {
|
||||
|
@ -28,7 +28,7 @@ void update_and_render(Arena *arena, App_State &app, f32 delta_time)
|
|||
// ImGui::SetCursorX(30);
|
||||
// ImGui::TextWrapped("%s", text_buf);
|
||||
static MemoryEditor mem_edit = make_memory_editor();
|
||||
mem_edit.DrawWindow("Hex View", app.inspected_file, app.inspected_file_size);
|
||||
mem_edit.DrawWindow("Hex View", app.inspected_fmem, app.inspected_file_size);
|
||||
ImGui::End();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -6,8 +6,11 @@
|
|||
#include <cstdint>
|
||||
#include <chrono>
|
||||
|
||||
// @Platform
|
||||
#include <sys/mman.h>
|
||||
#include <sys/inotify.h>
|
||||
#include <unistd.h>
|
||||
#include <limits.h> // for NAME_MAX
|
||||
|
||||
#ifdef DEBUG
|
||||
#include <sanitizer/asan_interface.h>
|
||||
|
@ -34,15 +37,6 @@ namespace chr = std::chrono;
|
|||
|
||||
using namespace ROOT::Experimental;
|
||||
|
||||
internal
|
||||
size_t file_size(FILE *f)
|
||||
{
|
||||
fseek(f, 0, SEEK_END);
|
||||
size_t res = ftell(f);
|
||||
fseek(f, 0, SEEK_SET);
|
||||
return res;
|
||||
}
|
||||
|
||||
internal
|
||||
b8 init_imgui(GLFWwindow* window) {
|
||||
IMGUI_CHECKVERSION();
|
||||
|
@ -124,12 +118,13 @@ int main(int argc, char **argv)
|
|||
return 1;
|
||||
}
|
||||
|
||||
// Open and map the file
|
||||
// Open and map te file
|
||||
FILE *file = fopen(fname, "rb");
|
||||
defer { fclose(file); };
|
||||
|
||||
const int fd = fileno(file);
|
||||
const size_t fsize = file_size(file);
|
||||
int fd = fileno(file);
|
||||
size_t fsize = file_size(file);
|
||||
// @Platform
|
||||
void *fmem = mmap(0, fsize, PROT_READ, MAP_SHARED_VALIDATE, fd, 0);
|
||||
if (!fmem) {
|
||||
fprintf(stderr, "Failed to open file %s\n", fname);
|
||||
|
@ -137,7 +132,21 @@ int main(int argc, char **argv)
|
|||
}
|
||||
defer { munmap(fmem, fsize); };
|
||||
|
||||
// @Platform: watch file for changes (to adapt the displayed file size - otherwise
|
||||
// we may try to access invalid memory when the file gets shrunk)
|
||||
int inot = inotify_init1(IN_NONBLOCK);
|
||||
if (inot == -1) {
|
||||
fprintf(stderr, "Failed to init inotify: %s (%d)\n", strerror(errno), errno);
|
||||
return 1;
|
||||
}
|
||||
if (inotify_add_watch(inot, fname, IN_MODIFY) == -1) {
|
||||
fprintf(stderr, "Failed to add inotify watch: %s (%d)\n", strerror(errno), errno);
|
||||
return 1;
|
||||
}
|
||||
defer { close(inot); };
|
||||
|
||||
// Open the TFile
|
||||
#if 0
|
||||
TFile *tfile = TFile::Open(fname, "READ");
|
||||
if (!tfile) {
|
||||
fprintf(stderr, "Failed to open TFile.\n");
|
||||
|
@ -151,11 +160,14 @@ int main(int argc, char **argv)
|
|||
fprintf(stderr, "RNTuple '%s' not found in %s.\n", ntpl_name, fname);
|
||||
return 1;
|
||||
}
|
||||
#endif
|
||||
|
||||
// Start main loop
|
||||
App_State app {};
|
||||
app.inspected_file = (u8*)fmem;
|
||||
app.inspected_file = file;
|
||||
app.inspected_fmem = (u8*)fmem;
|
||||
app.inspected_file_size = fsize;
|
||||
app.inot = inot;
|
||||
|
||||
run_main_loop(window, arena, app);
|
||||
|
||||
|
|
Loading…
Reference in a new issue