@@ -49,20 +49,6 @@ namespace {
49
49
static bool is_power_of_2 (size_t value) {
50
50
return value > 0 && (value & ~(value - 1 )) == value;
51
51
}
52
-
53
- /* *
54
- * Returns the next alignment for a given pointer.
55
- */
56
- static uint8_t * align_pointer (void * ptr, size_t alignment) {
57
- intptr_t addr = reinterpret_cast <intptr_t >(ptr);
58
- if ((addr & (alignment - 1 )) == 0 ) {
59
- // Already aligned.
60
- return reinterpret_cast <uint8_t *>(ptr);
61
- }
62
- // Bump forward.
63
- addr = (addr | (alignment - 1 )) + 1 ;
64
- return reinterpret_cast <uint8_t *>(addr);
65
- }
66
52
} // namespace
67
53
68
54
FileDataLoader::~FileDataLoader () {
@@ -129,13 +115,13 @@ namespace {
129
115
/* *
130
116
* FreeableBuffer::FreeFn-compatible callback.
131
117
*
132
- * `context` is actually a ptrdiff_t value (not a pointer) that contains the
133
- * offset in bytes between `data` and the actual pointer to free.
118
+ * `context` is the original buffer pointer. It is allocated with
119
+ * ET_ALIGNED_ALLOC, and must be freed with ET_ALIGNED_FREE.
120
+ *
121
+ * `data` and `size` are unused.
134
122
*/
135
123
void FreeSegment (void * context, void * data, ET_UNUSED size_t size) {
136
- ptrdiff_t offset = reinterpret_cast <ptrdiff_t >(context);
137
- ET_DCHECK_MSG (offset >= 0 , " Unexpected offset %ld" , (long int )offset);
138
- std::free (static_cast <uint8_t *>(data) - offset);
124
+ ET_ALIGNED_FREE (context);
139
125
}
140
126
} // namespace
141
127
@@ -163,57 +149,26 @@ Result<FreeableBuffer> FileDataLoader::load(
163
149
}
164
150
165
151
// Allocate memory for the FreeableBuffer.
166
- size_t alloc_size = size;
167
- if (alignment_ > alignof (std::max_align_t )) {
168
- // malloc() will align to smaller values, but we must manually align to
169
- // larger values.
170
- alloc_size += alignment_;
171
- }
172
- void * buffer = std::malloc (alloc_size);
173
- if (buffer == nullptr ) {
152
+ void * aligned_buffer = ET_ALIGNED_ALLOC (alignment_, size);
153
+ if (aligned_buffer == nullptr ) {
174
154
ET_LOG (
175
155
Error,
176
- " Reading from %s at offset %zu: malloc( %zd) failed" ,
156
+ " Reading from %s at offset %zu: ET_ALIGNED_ALLOC(%zd, %zd) failed" ,
177
157
file_name_,
178
158
offset,
159
+ alignment_,
179
160
size);
180
161
return Error::MemoryAllocationFailed;
181
162
}
182
163
183
- // Align.
184
- void * aligned_buffer = align_pointer (buffer, alignment_);
185
-
186
- // Assert that the alignment didn't overflow the buffer.
187
- ET_DCHECK_MSG (
188
- reinterpret_cast <uintptr_t >(aligned_buffer) + size <=
189
- reinterpret_cast <uintptr_t >(buffer) + alloc_size,
190
- " aligned_buffer %p + size %zu > buffer %p + alloc_size %zu" ,
191
- aligned_buffer,
192
- size,
193
- buffer,
194
- alloc_size);
195
-
196
164
auto err = load_into (offset, size, segment_info, aligned_buffer);
197
165
if (err != Error::Ok) {
198
- // Free `buffer`, which is what malloc() gave us, not `aligned_buffer`.
199
- std::free (buffer);
166
+ ET_ALIGNED_FREE (aligned_buffer);
200
167
return err;
201
168
}
202
169
203
- // We can't naively free this pointer, since it may not be what malloc() gave
204
- // us. Pass the offset to the real buffer as context. This is the number of
205
- // bytes that need to be subtracted from the FreeableBuffer::data() pointer to
206
- // find the actual pointer to free.
207
- return FreeableBuffer (
208
- aligned_buffer,
209
- size,
210
- FreeSegment,
211
- /* free_fn_context=*/
212
- reinterpret_cast <void *>(
213
- // Using signed types here because it will produce a signed ptrdiff_t
214
- // value, though for us it will always be non-negative.
215
- reinterpret_cast <intptr_t >(aligned_buffer) -
216
- reinterpret_cast <intptr_t >(buffer)));
170
+ // Pass the aligned_buffer pointer as context to FreeSegment.
171
+ return FreeableBuffer (aligned_buffer, size, FreeSegment, aligned_buffer);
217
172
}
218
173
219
174
Result<size_t > FileDataLoader::size () const {
0 commit comments