diff options
author | David Robillard <d@drobilla.net> | 2019-10-14 19:18:17 +0200 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2020-10-27 13:13:58 +0100 |
commit | 0e8a72aae08b64beb11d97f020c14126178d7545 (patch) | |
tree | 0cf783d174f2ddd95453c34aba3ef46fc3a5b9d7 /src | |
parent | 3ff6565bdf0861f9db3527b58919ca7481deca6c (diff) | |
download | serd-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.c | 14 | ||||
-rw-r--r-- | src/sink.h | 1 |
2 files changed, 12 insertions, 3 deletions
@@ -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 @@ -24,6 +24,7 @@ */ struct SerdSinkImpl { void* handle; + SerdFreeFunc free_handle; SerdBaseFunc base; SerdPrefixFunc prefix; SerdStatementFunc statement; |