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-10-27 13:13:58 +0100
commite2d2c7b027ac9ac142ae306d248f2d687df211eb (patch)
treec8326d3deb8b9bb23e2c815d88b917220ef0d85b /src/node.c
parent68b30967872915b93c600e353d2fd6d5fb4987c6 (diff)
downloadserd-e2d2c7b027ac9ac142ae306d248f2d687df211eb.tar.gz
serd-e2d2c7b027ac9ac142ae306d248f2d687df211eb.tar.bz2
serd-e2d2c7b027ac9ac142ae306d248f2d687df211eb.zip
Align nodes with posix_memalign if possible
Diffstat (limited to 'src/node.c')
-rw-r--r--src/node.c31
1 files changed, 16 insertions, 15 deletions
diff --git a/src/node.c b/src/node.c
index cc0b0a30..a2b0c1c5 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 "serd/serd.h"
@@ -31,37 +32,34 @@
#include <stdlib.h>
#include <string.h>
-static const size_t serd_node_align = sizeof(SerdNode);
-
static SerdNode*
serd_new_from_uri(const SerdURI* uri, const SerdURI* base);
static size_t
serd_node_pad_size(const size_t n_bytes)
{
- const size_t pad = serd_node_align - (n_bytes + 2) % serd_node_align;
- const size_t size = n_bytes + 2 + pad;
- assert(size % serd_node_align == 0);
- return size;
+ const size_t pad = sizeof(SerdNode) - (n_bytes + 2) % sizeof(SerdNode);
+
+ return n_bytes + 2 + pad;
}
static const SerdNode*
serd_node_meta_c(const SerdNode* node)
{
- return node + 1 + (serd_node_pad_size(node->n_bytes) / serd_node_align);
+ return node + 1 + (serd_node_pad_size(node->n_bytes) / sizeof(SerdNode));
}
static SerdNode*
serd_node_meta(SerdNode* node)
{
- return node + 1 + (serd_node_pad_size(node->n_bytes) / serd_node_align);
+ return node + 1 + (serd_node_pad_size(node->n_bytes) / sizeof(SerdNode));
}
static const SerdNode*
serd_node_maybe_get_meta_c(const SerdNode* node)
{
return (node->flags & (SERD_HAS_LANGUAGE | SERD_HAS_DATATYPE))
- ? (node + 1 + (serd_node_pad_size(node->n_bytes) / serd_node_align))
+ ? (node + 1 + (serd_node_pad_size(node->n_bytes) / sizeof(SerdNode)))
: NULL;
}
@@ -94,11 +92,12 @@ 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);
+
node->n_bytes = 0;
node->flags = flags;
node->type = type;
- assert((uintptr_t)node % serd_node_align == 0u);
+
return node;
}
@@ -184,7 +183,7 @@ serd_new_plain_literal_i(const char* str,
memcpy(serd_node_buffer(node), str, str_len);
node->n_bytes = str_len;
- SerdNode* lang_node = node + 1 + (len / serd_node_align);
+ SerdNode* lang_node = node + 1 + (len / sizeof(SerdNode));
lang_node->type = SERD_LITERAL;
lang_node->n_bytes = lang_len;
memcpy(serd_node_buffer(lang_node), lang, lang_len);
@@ -215,7 +214,7 @@ serd_new_typed_literal_i(const char* str,
memcpy(serd_node_buffer(node), str, str_len);
node->n_bytes = str_len;
- SerdNode* datatype_node = node + 1 + (len / serd_node_align);
+ SerdNode* datatype_node = node + 1 + (len / sizeof(SerdNode));
datatype_node->n_bytes = datatype_uri_len;
datatype_node->type = SERD_URI;
memcpy(serd_node_buffer(datatype_node), datatype_uri, datatype_uri_len);
@@ -339,9 +338,11 @@ 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);
+
memcpy(copy, node, size);
return copy;
}