dovecot: Added i_stream_set_destroy_callback().

dovecot at dovecot.org dovecot at dovecot.org
Sat Dec 22 03:05:34 EET 2007


details:   http://hg.dovecot.org/dovecot/rev/56a5a00e490c
changeset: 7023:56a5a00e490c
user:      Timo Sirainen <tss at iki.fi>
date:      Sat Dec 22 02:54:58 2007 +0200
description:
Added i_stream_set_destroy_callback().

diffstat:

4 files changed, 23 insertions(+)
src/lib/iostream-internal.h |    3 +++
src/lib/iostream.c          |    2 ++
src/lib/istream.c           |   10 ++++++++++
src/lib/istream.h           |    8 ++++++++

diffs (70 lines):

diff -r ebdd050c0a58 -r 56a5a00e490c src/lib/iostream-internal.h
--- 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 @@ struct iostream_private {
 	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);
diff -r ebdd050c0a58 -r 56a5a00e490c src/lib/iostream.c
--- 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 @@ void io_stream_unref(struct iostream_pri
 		return;
 
 	stream->close(stream);
+	if (stream->destroy_callback != NULL)
+		stream->destroy_callback(stream->destroy_context);
 	stream->destroy(stream);
 
         i_free(stream);
diff -r ebdd050c0a58 -r 56a5a00e490c src/lib/istream.c
--- 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
@@ -26,6 +26,16 @@ void i_stream_unref(struct istream **str
 	}
 	io_stream_unref(&(*stream)->real_stream->iostream);
 	*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)
diff -r ebdd050c0a58 -r 56a5a00e490c src/lib/istream.h
--- 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 {
 	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
 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);


More information about the dovecot-cvs mailing list