You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
naka/include/map.h

76 lines
1.6 KiB

//! Memory mapping abstraction
#ifndef _MAP_H
#define _MAP_H
#include <stdbool.h>
#include "ints.h"
typedef enum mm_err {
MAP_ERR_UNKNOWN = 0,
MAP_SUCCESS = 1,
MAP_ERR_MMAP,
MAP_ERR_UNMAP,
MAP_ERR_OPEN,
MAP_ERR_CLOSE,
MAP_ERR_STAT,
MAP_ERR_ADVISE,
} map_result_t;
typedef union memory_map {
// Common
struct {
union {
void* origin;
u8* area;
};
usize len;
};
// Specific to anon / file
struct mm_file {
void* origin;
usize len;
off_t fd_offset;
int fd;
} file;
struct mm_anon {
void* origin;
usize len;
} anon;
} map_t;
map_result_t map_fd(int fd, bool write, usize size, off_t offset, map_t *pOUT map);
/// Specify size as 0 to use the file's full size for the map.
map_result_t map_file(const char* file, bool write, usize size, off_t offset, map_t *pOUT map);
map_result_t map_anon(void* ptr, usize len, map_t *pOUT map);
map_result_t map_free(map_t map);
map_result_t map_preload(map_t *pINOUT map, bool random);
const char* map_error_str(map_result_t res);
_mixin int _map_handle_err(const char* stmt, const char* file, int line, const char* func, map_result_t res)
{
if(res == MAP_SUCCESS) return 1;
else COLD_BLOCK {
const char* err = map_error_str(res);
ERROR("mapping failed at %s:%d->%s(): on stmt `%s`", file, line, func, stmt);
switch(res) {
// Non-errno errors
case MAP_ERR_UNKNOWN:
case MAP_SUCCESS:
fprintf(stderr, err);
if(0)
// errno errors
default:
perror(err);
return 0;
}
}
UNREACHABLE();
}
#define map_handle_err(stmt) _map_handle_err(#stmt, __FILE__, __LINE__, __func__, stmt)
#endif /* _MAP_H */