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);
172 file->handle = handle;
201 __except (GetExceptionCode() == EXCEPTION_IN_PAGE_ERROR ? EXCEPTION_EXECUTE_HANDLER :
202 EXCEPTION_CONTINUE_SEARCH)
204 file->io_error =
true;
209 return !
file->io_error;
224 return file->io_error;
230 munmap((
void *)
file->memory,
file->length);
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.
SIMD_FORCE_INLINE btScalar length() const
Return the length of the vector.
void * MEM_callocN(size_t len, const char *str)
void MEM_freeN(void *vmemh)
void(* next_handler)(int, siginfo_t *, void *)