|
@@ -34,19 +34,11 @@
|
|
|
void * freelist_memalign(freelist_rb_t *raw_block, size_t alignment,
|
|
|
size_t size) {
|
|
|
void *return_ptr;
|
|
|
+ /* extra_size denotes the worst-case scenario. Because memcpy() is used,
|
|
|
+ * at least HEADER_SIZE is needed for no memory overlap. */
|
|
|
+ size_t extra_size = HEADER_SIZE + alignment - 1;
|
|
|
|
|
|
- /* To avoid issues with overwriting the memory block header, the header will
|
|
|
- * always be padded at least the size of the header. */
|
|
|
- unsigned int counter = 0;
|
|
|
- if(alignment < HEADER_SIZE) {
|
|
|
- size_t new_alignment = alignment;
|
|
|
- for(counter = 0; new_alignment < HEADER_SIZE; ++counter) {
|
|
|
- new_alignment += alignment;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- return_ptr = freelist_malloc(raw_block, size + (counter + 1) * alignment
|
|
|
- - 1);
|
|
|
+ return_ptr = freelist_malloc(raw_block, size + extra_size);
|
|
|
|
|
|
if(return_ptr != NULL) {
|
|
|
|
|
@@ -59,7 +51,9 @@ check_alignment:
|
|
|
}
|
|
|
|
|
|
size_t padding = (- (size_t) return_ptr) & (alignment - 1);
|
|
|
- padding += counter * alignment;
|
|
|
+ while(padding < HEADER_SIZE) {
|
|
|
+ padding += alignment;
|
|
|
+ }
|
|
|
|
|
|
block_header_t *block_header = get_header(return_ptr);
|
|
|
|
|
@@ -78,8 +72,7 @@ check_alignment:
|
|
|
if(previous_size_availability == 1) {
|
|
|
void *old_ptr = return_ptr;
|
|
|
|
|
|
- return_ptr = freelist_malloc(raw_block, size +
|
|
|
- (counter + 1) * alignment - 1);
|
|
|
+ return_ptr = freelist_malloc(raw_block, size + extra_size);
|
|
|
|
|
|
freelist_free(raw_block, old_ptr);
|
|
|
|