From e9d1b73352e9254e0b46f7af31acc5411d500baf Mon Sep 17 00:00:00 2001 From: David Robillard Date: Thu, 15 Apr 2021 10:52:11 -0400 Subject: Align node allocations --- src/node.c | 46 +++++++++++++++++++++++++++++++++++----------- 1 file changed, 35 insertions(+), 11 deletions(-) (limited to 'src/node.c') diff --git a/src/node.c b/src/node.c index ff3f3f71..090dee99 100644 --- a/src/node.c +++ b/src/node.c @@ -18,9 +18,11 @@ #include "base64.h" #include "string_utils.h" +#include "system.h" #include "serd/serd.h" +#include #include #include #include @@ -38,6 +40,8 @@ # endif #endif +static const size_t serd_node_align = 2 * sizeof(uint64_t); + static size_t serd_uri_string_length(const SerdURIView* const uri) { @@ -66,12 +70,27 @@ string_sink(const void* const buf, const size_t len, void* const stream) return len; } +static size_t +serd_node_pad_size(const size_t n_bytes) +{ + const size_t pad = sizeof(SerdNode) - (n_bytes + 2) % sizeof(SerdNode); + return n_bytes + 2 + pad; +} + +static SERD_PURE_FUNC +size_t +serd_node_total_size(const SerdNode* const node) +{ + return node ? (sizeof(SerdNode) + serd_node_pad_size(node->length)) : 0; +} + SerdNode* serd_node_malloc(const size_t length, const SerdNodeFlags flags, const SerdNodeType type) { - SerdNode* node = (SerdNode*)calloc(1, sizeof(SerdNode) + length + 1); + const size_t size = sizeof(SerdNode) + serd_node_pad_size(length); + SerdNode* node = (SerdNode*)serd_calloc_aligned(serd_node_align, size); node->length = 0; node->flags = flags; @@ -83,15 +102,20 @@ serd_node_malloc(const size_t length, void serd_node_set(SerdNode** const dst, const SerdNode* const src) { - if (src) { - if (!(*dst) || (*dst)->length < src->length) { - (*dst) = (SerdNode*)realloc(*dst, sizeof(SerdNode) + src->length + 1); - } + if (!src) { + serd_free_aligned(*dst); + *dst = NULL; + return; + } - memcpy(*dst, src, sizeof(SerdNode) + src->length + 1); - } else if (*dst) { - memset(*dst, 0, sizeof(SerdNode)); + const size_t size = serd_node_total_size(src); + if (!*dst || serd_node_total_size(*dst) < size) { + serd_free_aligned(*dst); + *dst = (SerdNode*)serd_calloc_aligned(serd_node_align, size); } + + assert(*dst); + memcpy(*dst, src, sizeof(SerdNode) + src->length + 1); } SerdNode* @@ -125,8 +149,8 @@ serd_node_copy(const SerdNode* node) return NULL; } - const size_t size = sizeof(SerdNode) + node->length + 1; - SerdNode* copy = (SerdNode*)malloc(size); + const size_t size = serd_node_total_size(node); + SerdNode* copy = (SerdNode*)serd_calloc_aligned(serd_node_align, size); memcpy(copy, node, size); return copy; } @@ -435,5 +459,5 @@ serd_node_flags(const SerdNode* const node) void serd_node_free(SerdNode* const node) { - free(node); + serd_free_aligned(node); } -- cgit v1.2.1