aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2019-10-14 19:18:17 +0200
committerDavid Robillard <d@drobilla.net>2020-10-27 13:13:58 +0100
commit0e8a72aae08b64beb11d97f020c14126178d7545 (patch)
tree0cf783d174f2ddd95453c34aba3ef46fc3a5b9d7 /src
parent3ff6565bdf0861f9db3527b58919ca7481deca6c (diff)
downloadserd-0e8a72aae08b64beb11d97f020c14126178d7545.tar.gz
serd-0e8a72aae08b64beb11d97f020c14126178d7545.tar.bz2
serd-0e8a72aae08b64beb11d97f020c14126178d7545.zip
Add function to SerdSink for freeing opaque handle
This can be used to associate dynamically allocated data with a sink and have it managed along with the sink's lifetime.
Diffstat (limited to 'src')
-rw-r--r--src/sink.c14
-rw-r--r--src/sink.h1
2 files changed, 12 insertions, 3 deletions
diff --git a/src/sink.c b/src/sink.c
index edaf271f..498935a0 100644
--- a/src/sink.c
+++ b/src/sink.c
@@ -23,18 +23,26 @@
#include <stdlib.h>
SerdSink*
-serd_sink_new(void* handle)
+serd_sink_new(void* handle, SerdFreeFunc free_handle)
{
SerdSink* sink = (SerdSink*)calloc(1, sizeof(SerdSink));
- sink->handle = handle;
+ sink->handle = handle;
+ sink->free_handle = free_handle;
+
return sink;
}
void
serd_sink_free(SerdSink* sink)
{
- free(sink);
+ if (sink) {
+ if (sink->free_handle) {
+ sink->free_handle(sink->handle);
+ }
+
+ free(sink);
+ }
}
SerdStatus
diff --git a/src/sink.h b/src/sink.h
index 57c52021..d9b5c59c 100644
--- a/src/sink.h
+++ b/src/sink.h
@@ -24,6 +24,7 @@
*/
struct SerdSinkImpl {
void* handle;
+ SerdFreeFunc free_handle;
SerdBaseFunc base;
SerdPrefixFunc prefix;
SerdStatementFunc statement;