From 0e8a72aae08b64beb11d97f020c14126178d7545 Mon Sep 17 00:00:00 2001 From: David Robillard Date: Mon, 14 Oct 2019 19:18:17 +0200 Subject: 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. --- src/sink.c | 14 +++++++++++--- src/sink.h | 1 + 2 files changed, 12 insertions(+), 3 deletions(-) (limited to 'src') 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 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; -- cgit v1.2.1