66 lines
1.4 KiB
C
66 lines
1.4 KiB
C
|
#include <sys/mman.h>
|
||
|
#include <sys/inotify.h>
|
||
|
#include <unistd.h>
|
||
|
#include <limits.h> // for NAME_MAX
|
||
|
|
||
|
internal
|
||
|
void os_open_and_map_file(const char *fname, App_State &app)
|
||
|
{
|
||
|
FILE *file = fopen(fname, "rb");
|
||
|
int fd = fileno(file);
|
||
|
size_t fsize = file_size(file);
|
||
|
|
||
|
void *fmem = mmap(0, fsize, PROT_READ, MAP_SHARED_VALIDATE, fd, 0);
|
||
|
if (!fmem)
|
||
|
fprintf(stderr, "Failed to open file %s\n", fname);
|
||
|
|
||
|
app.inspected_file = file;
|
||
|
app.inspected_file_size = fsize;
|
||
|
app.inspected_fmem = reinterpret_cast<u8*>(fmem);
|
||
|
}
|
||
|
|
||
|
internal
|
||
|
void os_unmap_file(u8 *&mem, u64 size)
|
||
|
{
|
||
|
if (mem) munmap(mem, size);
|
||
|
mem = nullptr;
|
||
|
}
|
||
|
|
||
|
internal
|
||
|
void os_start_file_watch(const char *fname, App_State &app)
|
||
|
{
|
||
|
int inot = inotify_init1(IN_NONBLOCK);
|
||
|
if (inot == -1)
|
||
|
fprintf(stderr, "Failed to init inotify: %s (%d)\n", strerror(errno), errno);
|
||
|
if (inotify_add_watch(inot, fname, IN_MODIFY) == -1)
|
||
|
fprintf(stderr, "Failed to add inotify watch: %s (%d)\n", strerror(errno), errno);
|
||
|
|
||
|
app.inot = inot;
|
||
|
}
|
||
|
|
||
|
internal
|
||
|
void os_stop_file_watch(App_State &app)
|
||
|
{
|
||
|
if (app.inot != -1) close(app.inot);
|
||
|
app.inot = -1;
|
||
|
}
|
||
|
|
||
|
internal
|
||
|
void *os_reserve(u64 size)
|
||
|
{
|
||
|
return mmap(0, size, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
|
||
|
}
|
||
|
|
||
|
internal
|
||
|
void os_release(void *mem, u64 size)
|
||
|
{
|
||
|
munmap(mem, size);
|
||
|
}
|
||
|
|
||
|
internal
|
||
|
b32x os_commit(void *addr, u64 size)
|
||
|
{
|
||
|
return mprotect(addr, size, PROT_READ|PROT_WRITE) == 0;
|
||
|
}
|
||
|
|