18 # include <sys/mman.h>
65 char *error_addr = (
char *)siginfo->si_addr;
71 if (error_addr >=
file->memory && error_addr < file->memory +
file->length) {
72 file->io_error =
true;
75 const void *mapped_memory = mmap(
76 file->memory,
file->length, PROT_READ, MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED, -1, 0);
77 if (mapped_memory == MAP_FAILED) {
78 fprintf(stderr,
"SIGBUS handler: Error replacing mapped file with zeros\n");
90 fprintf(stderr,
"Unhandled SIGBUS caught\n");
99 struct sigaction newact = {0}, oldact = {0};
102 newact.sa_flags = SA_SIGINFO;
104 if (sigaction(SIGBUS, &newact, &oldact)) {
133 void *memory, *handle =
NULL;
143 memory = mmap(
NULL,
length, PROT_READ, MAP_PRIVATE, fd, 0);
144 if (memory == MAP_FAILED) {
149 void *file_handle = (
void *)_get_osfhandle(fd);
153 handle = CreateFileMapping(file_handle,
NULL, PAGE_READONLY, 0, 0,
NULL);
154 if (handle ==
NULL) {
157 memory = MapViewOfFile(handle, FILE_MAP_READ, 0, 0, 0);
158 if (memory ==
NULL) {
166 file->memory = memory;
167 file->handle = handle;
195 __except (GetExceptionCode() == EXCEPTION_IN_PAGE_ERROR ? EXCEPTION_EXECUTE_HANDLER :
196 EXCEPTION_CONTINUE_SEARCH) {
197 file->io_error =
true;
202 return !
file->io_error;
213 munmap((
void *)
file->memory,
file->length);
216 UnmapViewOfFile(
file->memory);
217 CloseHandle(
file->handle);
File and directory operations.
int64_t BLI_lseek(int fd, int64_t offset, int whence)
#define LISTBASE_FOREACH(type, var, list)
void BLI_freelinkN(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
struct LinkData * BLI_genericNodeN(void *data)
void BLI_addtail(struct 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)
static bool sigbus_handler_setup(void)
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)
static struct error_handler_data error_handler
static void sigbus_handler_add(BLI_mmap_file *file)
BLI_mmap_file * BLI_mmap_open(int fd)
void * BLI_mmap_get_pointer(BLI_mmap_file *file)
Compatibility-like things for windows.
Read Guarded memory(de)allocation.
SyclQueue void void size_t num_bytes void
ccl_gpu_kernel_postfix ccl_global float int int int int float bool int offset
void(* MEM_freeN)(void *vmemh)
void *(* MEM_callocN)(size_t len, const char *str)
T length(const vec_base< T, Size > &a)
void(* next_handler)(int, siginfo_t *, void *)