diff options
author | David Robillard <d@drobilla.net> | 2019-04-09 10:28:59 +0200 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2020-06-21 18:12:04 +0200 |
commit | ff7d07e560eb32c9c10d41d25a7b8ea4cfdf7f69 (patch) | |
tree | 943514c868285e02c45d821c5a77c5dc153cd39a /src/node.c | |
parent | 1e299f9f1f9cd621d98a1bae86047a28de9c24f6 (diff) | |
download | serd-ff7d07e560eb32c9c10d41d25a7b8ea4cfdf7f69.tar.gz serd-ff7d07e560eb32c9c10d41d25a7b8ea4cfdf7f69.tar.bz2 serd-ff7d07e560eb32c9c10d41d25a7b8ea4cfdf7f69.zip |
Allocate nodes with posix_memalign when available
This fixes platforms where the system malloc returns memory that is not aligned
to sizeof(SerdNode) (128 bits).
Diffstat (limited to 'src/node.c')
-rw-r--r-- | src/node.c | 15 |
1 files changed, 11 insertions, 4 deletions
@@ -19,6 +19,7 @@ #include "serd_internal.h" #include "static_nodes.h" #include "string_utils.h" +#include "system.h" #include <assert.h> #include <float.h> @@ -92,11 +93,13 @@ SerdNode* serd_node_malloc(size_t n_bytes, SerdNodeFlags flags, SerdNodeType type) { const size_t size = sizeof(SerdNode) + serd_node_pad_size(n_bytes); - SerdNode* node = (SerdNode*)calloc(1, size); + SerdNode* node = (SerdNode*)serd_calloc_aligned(size, serd_node_align); + + assert((uintptr_t)node % serd_node_align == 0); + node->n_bytes = 0; node->flags = flags; node->type = type; - assert((intptr_t)node % serd_node_align == 0); return node; } @@ -337,9 +340,13 @@ serd_node_copy(const SerdNode* node) return NULL; } - const size_t size = serd_node_total_size(node); serd_node_check_padding(node); - SerdNode* copy = (SerdNode*)calloc(1, size + 3); + + const size_t size = serd_node_total_size(node); + SerdNode* copy = (SerdNode*)serd_calloc_aligned(size + 3, serd_node_align); + + assert((intptr_t)node % serd_node_align == 0); + memcpy(copy, node, size); return copy; } |