aboutsummaryrefslogtreecommitdiffstats
path: root/src/node.c
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2019-04-09 10:28:59 +0200
committerDavid Robillard <d@drobilla.net>2020-06-21 18:12:04 +0200
commitff7d07e560eb32c9c10d41d25a7b8ea4cfdf7f69 (patch)
tree943514c868285e02c45d821c5a77c5dc153cd39a /src/node.c
parent1e299f9f1f9cd621d98a1bae86047a28de9c24f6 (diff)
downloadserd-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.c15
1 files changed, 11 insertions, 4 deletions
diff --git a/src/node.c b/src/node.c
index 913789d7..56c8d699 100644
--- a/src/node.c
+++ b/src/node.c
@@ -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;
}