changeset 7023:56a5a00e490c HEAD

Added i_stream_set_destroy_callback().
author Timo Sirainen <tss@iki.fi>
date Sat, 22 Dec 2007 02:54:58 +0200
parents ebdd050c0a58
children b42691420ff8
files src/lib/iostream-internal.h src/lib/iostream.c src/lib/istream.c src/lib/istream.h
diffstat 4 files changed, 23 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib/iostream-internal.h	Sat Dec 22 02:53:20 2007 +0200
+++ b/src/lib/iostream-internal.h	Sat Dec 22 02:54:58 2007 +0200
@@ -10,6 +10,9 @@
 	void (*destroy)(struct iostream_private *stream);
 	void (*set_max_buffer_size)(struct iostream_private *stream,
 				    size_t max_size);
+
+	void (*destroy_callback)(void *context);
+	void *destroy_context;
 };
 
 void io_stream_init(struct iostream_private *stream);
--- a/src/lib/iostream.c	Sat Dec 22 02:53:20 2007 +0200
+++ b/src/lib/iostream.c	Sat Dec 22 02:54:58 2007 +0200
@@ -30,6 +30,8 @@
 		return;
 
 	stream->close(stream);
+	if (stream->destroy_callback != NULL)
+		stream->destroy_callback(stream->destroy_context);
 	stream->destroy(stream);
 
         i_free(stream);
--- a/src/lib/istream.c	Sat Dec 22 02:53:20 2007 +0200
+++ b/src/lib/istream.c	Sat Dec 22 02:54:58 2007 +0200
@@ -28,6 +28,16 @@
 	*stream = NULL;
 }
 
+#undef i_stream_set_destroy_callback
+void i_stream_set_destroy_callback(struct istream *stream,
+				   istream_callback_t *callback, void *context)
+{
+	struct iostream_private *iostream = &stream->real_stream->iostream;
+
+	iostream->destroy_callback = callback;
+	iostream->destroy_context = context;
+}
+
 int i_stream_get_fd(struct istream *stream)
 {
 	struct istream_private *_stream = stream->real_stream;
--- a/src/lib/istream.h	Sat Dec 22 02:53:20 2007 +0200
+++ b/src/lib/istream.h	Sat Dec 22 02:54:58 2007 +0200
@@ -18,6 +18,8 @@
 	struct istream_private *real_stream;
 };
 
+typedef void istream_callback_t(void *context);
+
 struct istream *i_stream_create_fd(int fd, size_t max_buffer_size,
 				   bool autoclose_fd);
 struct istream *i_stream_create_mmap(int fd, size_t block_size,
@@ -35,6 +37,12 @@
 void i_stream_ref(struct istream *stream);
 /* Unreferences the stream and sets stream pointer to NULL. */
 void i_stream_unref(struct istream **stream);
+/* Call the given callback function when stream is destroyed. */
+void i_stream_set_destroy_callback(struct istream *stream,
+				   istream_callback_t *callback, void *context);
+#define i_stream_set_destroy_callback(stream, callback, context) \
+	CONTEXT_CALLBACK(i_stream_set_destroy_callback, istream_callback_t, \
+			 callback, context, stream)
 
 /* Return file descriptor for stream, or -1 if none is available. */
 int i_stream_get_fd(struct istream *stream);