aboutsummaryrefslogtreecommitdiffstats
path: root/include/serd/world.h
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2023-12-02 01:20:48 -0500
committerDavid Robillard <d@drobilla.net>2023-12-02 18:49:07 -0500
commit930f28478ca2573b7f7baf29a57a03cfa95a841f (patch)
treeccd9fca0955c8c92e6f3d3cacd032024c1c3d4b7 /include/serd/world.h
parent06bc73c6fdf986eb5d13943b497992a947661bb1 (diff)
downloadserd-930f28478ca2573b7f7baf29a57a03cfa95a841f.tar.gz
serd-930f28478ca2573b7f7baf29a57a03cfa95a841f.tar.bz2
serd-930f28478ca2573b7f7baf29a57a03cfa95a841f.zip
Add a set of limits to the world
The idea here is to remove the burden of passing things around like stack sizes (where most users don't care and will be happy with a reasonably large default) and keeping the call sites to things like serd_reader_new() clean. The cost is a bit more state, so it's both more powerful and more potentially flaky, since changing the limits has action at a distance that isn't clear from the call site. I think it's worth it for the cleaner API in the common case, and the much better forward compatibility.
Diffstat (limited to 'include/serd/world.h')
-rw-r--r--include/serd/world.h29
1 files changed, 29 insertions, 0 deletions
diff --git a/include/serd/world.h b/include/serd/world.h
index abf2999c..fe381628 100644
--- a/include/serd/world.h
+++ b/include/serd/world.h
@@ -7,6 +7,9 @@
#include "serd/attributes.h"
#include "serd/error.h"
#include "serd/node.h"
+#include "serd/status.h"
+
+#include <stddef.h>
SERD_BEGIN_DECLS
@@ -19,6 +22,11 @@ SERD_BEGIN_DECLS
/// Global library state
typedef struct SerdWorldImpl SerdWorld;
+/// Resource limits to control allocation
+typedef struct {
+ size_t reader_stack_size;
+} SerdLimits;
+
/**
Create a new Serd World.
@@ -33,6 +41,27 @@ SERD_API void
serd_world_free(SerdWorld* SERD_NULLABLE world);
/**
+ Return the current resource limits.
+
+ These determine how much memory is allocated for reading and writing (where
+ the required stack space depends on the input data. The defaults use about
+ a megabyte and over 100 levels of nesting, which is more than enough for
+ most data.
+*/
+SERD_API SerdLimits
+serd_world_limits(const SerdWorld* SERD_NONNULL world);
+
+/**
+ Set the current resource limits.
+
+ This updates the "current" limits, that is, those that will be used after
+ this call. It can be used to configure allocation sizes before calling some
+ other function like serd_reader_new() that uses the current limits.
+*/
+SERD_API SerdStatus
+serd_world_set_limits(SerdWorld* SERD_NONNULL world, SerdLimits limits);
+
+/**
Return a unique blank node.
The returned node is valid only until the next time serd_world_get_blank()