66 const char *error_addr = (
const char *)siginfo->si_addr;
72 if (error_addr >= file->
memory && error_addr < file->memory + file->
length) {
76 const void *mapped_memory = mmap(
77 file->
memory, file->
length, PROT_READ, MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED, -1, 0);
78 if (mapped_memory == MAP_FAILED) {
79 fprintf(stderr,
"SIGBUS handler: Error replacing mapped file with zeros\n");
91 fprintf(stderr,
"Unhandled SIGBUS caught\n");
100 struct sigaction newact = {{
nullptr}}, oldact = {{
nullptr}};
103 newact.sa_flags = SA_SIGINFO;
105 if (sigaction(SIGBUS, &newact, &oldact)) {
135 void *memory, *handle =
nullptr;
148 memory = mmap(
nullptr,
length, PROT_READ, MAP_PRIVATE, fd, 0);
149 if (memory == MAP_FAILED) {
154 void *file_handle = (
void *)_get_osfhandle(fd);
158 handle = CreateFileMapping(file_handle,
nullptr, PAGE_READONLY, 0, 0,
nullptr);
159 if (handle ==
nullptr) {
162 memory = MapViewOfFile(handle, FILE_MAP_READ, 0, 0, 0);
163 if (memory ==
nullptr) {
171 file->
memory =
static_cast<char *
>(memory);
201 __except (GetExceptionCode() == EXCEPTION_IN_PAGE_ERROR ? EXCEPTION_EXECUTE_HANDLER :
202 EXCEPTION_CONTINUE_SEARCH)
233 UnmapViewOfFile(file->
memory);
234 CloseHandle(file->
handle);
File and directory operations.
int64_t BLI_lseek(int fd, int64_t offset, int whence)
LinkData * BLI_genericNodeN(void *data)
#define LISTBASE_FOREACH(type, var, list)
void BLI_freelinkN(ListBase *listbase, void *vlink) ATTR_NONNULL(1)
void BLI_addtail(ListBase *listbase, void *vlink) ATTR_NONNULL(1)
void * BLI_findptr(const struct ListBase *listbase, const void *ptr, int offset) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
void BLI_mmap_free(BLI_mmap_file *file)
bool BLI_mmap_read(BLI_mmap_file *file, void *dest, size_t offset, size_t length)
static void sigbus_handler_remove(BLI_mmap_file *file)
static void sigbus_handler(int sig, siginfo_t *siginfo, void *ptr)
BLI_mmap_file * BLI_mmap_open(int fd)
static bool sigbus_handler_setup()
static struct error_handler_data error_handler
size_t BLI_mmap_get_length(const BLI_mmap_file *file)
static void sigbus_handler_add(BLI_mmap_file *file)
bool BLI_mmap_any_io_error(const BLI_mmap_file *file)
void * BLI_mmap_get_pointer(BLI_mmap_file *file)
Compatibility-like things for windows.
Read Guarded memory(de)allocation.
BMesh const char void * data
float length(VecOp< float, D >) RET
void * MEM_callocN(size_t len, const char *str)
void MEM_freeN(void *vmemh)
void(* next_handler)(int, siginfo_t *, void *)