Blender V5.0
filereader_memory.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2004-2021 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
8
9#include <algorithm>
10#include <cstring>
11
12#include "BLI_fileops.hh"
13#include "BLI_filereader.h"
14#include "BLI_mmap.h"
15
16#include "MEM_guardedalloc.h"
17
18/* This file implements both memory-backed and memory-mapped-file-backed reading. */
21
22 const char *data;
24 size_t length;
25};
26
27static int64_t memory_read_raw(FileReader *reader, void *buffer, size_t size)
28{
29 MemoryReader *mem = (MemoryReader *)reader;
30
31 /* Don't read more bytes than there are available in the buffer. */
32 size_t readsize = std::min(size, size_t(mem->length - mem->reader.offset));
33
34 memcpy(buffer, mem->data + mem->reader.offset, readsize);
35 mem->reader.offset += readsize;
36
37 return readsize;
38}
39
40static off64_t memory_seek(FileReader *reader, off64_t offset, int whence)
41{
42 MemoryReader *mem = (MemoryReader *)reader;
43
44 off64_t new_pos;
45 if (whence == SEEK_CUR) {
46 new_pos = mem->reader.offset + offset;
47 }
48 else if (whence == SEEK_SET) {
49 new_pos = offset;
50 }
51 else if (whence == SEEK_END) {
52 new_pos = mem->length + offset;
53 }
54 else {
55 return -1;
56 }
57
58 if (new_pos < 0 || new_pos > mem->length) {
59 return -1;
60 }
61
62 mem->reader.offset = new_pos;
63 return mem->reader.offset;
64}
65
66static void memory_close_raw(FileReader *reader)
67{
68 MEM_freeN(reader);
69}
70
72{
74
75 mem->data = (const char *)data;
76 mem->length = len;
77
79 mem->reader.seek = memory_seek;
81
82 return (FileReader *)mem;
83}
84
85/* Memory-mapped file reading.
86 * By using `mmap()`, we can map a file so that it can be treated like normal memory,
87 * meaning that we can just read from it with `memcpy()` etc.
88 * This avoids system call overhead and can significantly speed up file loading.
89 */
90
91static int64_t memory_read_mmap(FileReader *reader, void *buffer, size_t size)
92{
93 MemoryReader *mem = (MemoryReader *)reader;
94
95 /* Don't read more bytes than there are available in the buffer. */
96 size_t readsize = std::min(size, size_t(mem->length - mem->reader.offset));
97
98 if (!BLI_mmap_read(mem->mmap, buffer, mem->reader.offset, readsize)) {
99 return 0;
100 }
101
102 mem->reader.offset += readsize;
103
104 return readsize;
105}
106
107static void memory_close_mmap(FileReader *reader)
108{
109 MemoryReader *mem = (MemoryReader *)reader;
110 BLI_mmap_free(mem->mmap);
111 MEM_freeN(mem);
112}
113
115{
116 BLI_mmap_file *mmap = BLI_mmap_open(filedes);
117 if (mmap == nullptr) {
118 return nullptr;
119 }
120
122
123 mem->mmap = mmap;
124 mem->length = BLI_mmap_get_length(mmap);
125
127 mem->reader.seek = memory_seek;
129
130 return (FileReader *)mem;
131}
File and directory operations.
Wrapper for reading from various sources (e.g. raw files, compressed files, memory....
bool BLI_mmap_read(BLI_mmap_file *file, void *dest, size_t offset, size_t length) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
Definition BLI_mmap.cc:459
void BLI_mmap_free(BLI_mmap_file *file) ATTR_NONNULL(1)
Definition BLI_mmap.cc:487
BLI_mmap_file * BLI_mmap_open(int fd) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT
Definition BLI_mmap.cc:367
size_t BLI_mmap_get_length(const BLI_mmap_file *file) ATTR_WARN_UNUSED_RESULT
Definition BLI_mmap.cc:477
Read Guarded memory(de)allocation.
BMesh const char void * data
long long int int64_t
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
Definition btDbvt.cpp:52
static void memory_close_mmap(FileReader *reader)
static int64_t memory_read_mmap(FileReader *reader, void *buffer, size_t size)
static void memory_close_raw(FileReader *reader)
static off64_t memory_seek(FileReader *reader, off64_t offset, int whence)
FileReader * BLI_filereader_new_mmap(int filedes)
static int64_t memory_read_raw(FileReader *reader, void *buffer, size_t size)
FileReader * BLI_filereader_new_memory(const void *data, size_t len)
void * MEM_callocN(size_t len, const char *str)
Definition mallocn.cc:118
void MEM_freeN(void *vmemh)
Definition mallocn.cc:113
FileReaderSeekFn seek
off64_t offset
FileReaderCloseFn close
FileReaderReadFn read
const char * data
BLI_mmap_file * mmap
uint len