changeset 20811:1bd9c2258fd9

io: Add source filename This will make debugging alot easier when you can see what the filename is as well.
author Aki Tuomi <aki.tuomi@dovecot.fi>
date Mon, 03 Oct 2016 09:11:23 +0300
parents 5856fd118fb3
children d2969430234a
files src/lib/ioloop-notify-inotify.c src/lib/ioloop-notify-kqueue.c src/lib/ioloop-notify-none.c src/lib/ioloop-private.h src/lib/ioloop.c src/lib/ioloop.h
diffstat 6 files changed, 56 insertions(+), 28 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib/ioloop-notify-inotify.c	Fri Sep 30 13:42:45 2016 +0300
+++ b/src/lib/ioloop-notify-inotify.c	Mon Oct 03 09:11:23 2016 +0300
@@ -86,7 +86,8 @@
 
 #undef io_add_notify
 enum io_notify_result
-io_add_notify(const char *path, unsigned int source_linenum,
+io_add_notify(const char *path, const char *source_filename,
+	      unsigned int source_linenum,
 	      io_callback_t *callback, void *context, struct io **io_r)
 {
 	struct ioloop_notify_handler_context *ctx =
@@ -126,6 +127,7 @@
 	}
 
 	*io_r = io_notify_fd_add(&ctx->fd_ctx, wd, callback, context);
+	(*io_r)->source_filename = source_filename;
 	(*io_r)->source_linenum = source_linenum;
 	return IO_NOTIFY_ADDED;
 }
@@ -197,8 +199,9 @@
 		struct io_notify *io = ctx->fd_ctx.notifies;
 		struct io *_io = &io->io;
 
-		i_warning("I/O notify leak: %p (line %u, fd %d)",
+		i_warning("I/O notify leak: %p (%s:%u, fd %d)",
 			  (void *)_io->callback,
+			  _io->source_filename,
 			  _io->source_linenum, io->fd);
 		io_remove(&_io);
 	}
--- a/src/lib/ioloop-notify-kqueue.c	Fri Sep 30 13:42:45 2016 +0300
+++ b/src/lib/ioloop-notify-kqueue.c	Mon Oct 03 09:11:23 2016 +0300
@@ -111,8 +111,9 @@
 		struct io_notify *io = ctx->notifies;
 		struct io *_io = &io->io;
 
-		i_warning("I/O notify leak: %p (line %u, fd %d)",
+		i_warning("I/O notify leak: %p (%s:%u, fd %d)",
 			  (void *)_io->callback,
+			  _io->source_filename,
 			  _io->source_linenum, io->fd);
 		io_remove(&_io);
 	}
@@ -126,7 +127,8 @@
 
 #undef io_add_notify
 enum io_notify_result
-io_add_notify(const char *path, unsigned int source_linenum,
+io_add_notify(const char *path, const char *source_filename,
+	      unsigned int source_linenum,
 	      io_callback_t *callback, void *context, struct io **io_r)
 {
 	struct ioloop_notify_handler_context *ctx =
--- a/src/lib/ioloop-notify-none.c	Fri Sep 30 13:42:45 2016 +0300
+++ b/src/lib/ioloop-notify-none.c	Mon Oct 03 09:11:23 2016 +0300
@@ -8,6 +8,7 @@
 #undef io_add_notify
 enum io_notify_result
 io_add_notify(const char *path ATTR_UNUSED,
+	      const char *source_filename ATTR_UNUSED,
 	      unsigned int source_linenum ATTR_UNUSED,
 	      io_callback_t *callback ATTR_UNUSED,
 	      void *context ATTR_UNUSED, struct io **io_r)
--- a/src/lib/ioloop-private.h	Fri Sep 30 13:42:45 2016 +0300
+++ b/src/lib/ioloop-private.h	Mon Oct 03 09:11:23 2016 +0300
@@ -35,6 +35,7 @@
 
 struct io {
 	enum io_condition condition;
+	const char *source_filename;
 	unsigned int source_linenum;
 	/* trigger I/O callback even if OS doesn't think there is input
 	   pending */
@@ -62,6 +63,7 @@
 
 struct timeout {
 	struct priorityq_item item;
+	const char *source_filename;
 	unsigned int source_linenum;
 
         unsigned int msecs;
--- a/src/lib/ioloop.c	Fri Sep 30 13:42:45 2016 +0300
+++ b/src/lib/ioloop.c	Mon Oct 03 09:11:23 2016 +0300
@@ -31,6 +31,7 @@
 
 static struct io_file *
 io_add_file(int fd, enum io_condition condition,
+	    const char *source_filename,
 	    unsigned int source_linenum,
 	    io_callback_t *callback, void *context)
 {
@@ -44,6 +45,7 @@
 	io->io.callback = callback;
         io->io.context = context;
 	io->io.ioloop = current_ioloop;
+	io->io.source_filename = source_filename;
 	io->io.source_linenum = source_linenum;
 	io->refcount = 1;
 	io->fd = fd;
@@ -72,24 +74,26 @@
 
 #undef io_add
 struct io *io_add(int fd, enum io_condition condition,
+		  const char *source_filename,
 		  unsigned int source_linenum,
 		  io_callback_t *callback, void *context)
 {
 	struct io_file *io;
 
 	i_assert(fd >= 0);
-	io = io_add_file(fd, condition, source_linenum, callback, context);
+	io = io_add_file(fd, condition, source_filename, source_linenum, callback, context);
 	return &io->io;
 }
 
 #undef io_add_istream
-struct io *io_add_istream(struct istream *input, unsigned int source_linenum,
+struct io *io_add_istream(struct istream *input, const char *source_filename,
+			  unsigned int source_linenum,
 			  io_callback_t *callback, void *context)
 {
 	struct io_file *io;
 
-	io = io_add_file(i_stream_get_fd(input), IO_READ, source_linenum,
-			 callback, context);
+	io = io_add_file(i_stream_get_fd(input), IO_READ, source_filename,
+			 source_linenum, callback, context);
 	io->istream = input;
 	i_stream_ref(io->istream);
 	i_stream_set_io(io->istream, &io->io);
@@ -203,13 +207,14 @@
 }
 
 static struct timeout *
-timeout_add_common(unsigned int source_linenum,
+timeout_add_common(const char *source_filename, unsigned int source_linenum,
 			    timeout_callback_t *callback, void *context)
 {
 	struct timeout *timeout;
 
 	timeout = i_new(struct timeout, 1);
 	timeout->item.idx = UINT_MAX;
+	timeout->source_filename = source_filename;
 	timeout->source_linenum = source_linenum;
 	timeout->ioloop = current_ioloop;
 
@@ -225,12 +230,13 @@
 }
 
 #undef timeout_add
-struct timeout *timeout_add(unsigned int msecs, unsigned int source_linenum,
+struct timeout *timeout_add(unsigned int msecs, const char *source_filename,
+			    unsigned int source_linenum,
 			    timeout_callback_t *callback, void *context)
 {
 	struct timeout *timeout;
 
-	timeout = timeout_add_common(source_linenum, callback, context);
+	timeout = timeout_add_common(source_filename, source_linenum, callback, context);
 	timeout->msecs = msecs;
 
 	if (msecs > 0) {
@@ -247,21 +253,24 @@
 
 #undef timeout_add_short
 struct timeout *
-timeout_add_short(unsigned int msecs, unsigned int source_linenum,
+timeout_add_short(unsigned int msecs, const char *source_filename,
+		  unsigned int source_linenum,
 		  timeout_callback_t *callback, void *context)
 {
-	return timeout_add(msecs, source_linenum, callback, context);
+	return timeout_add(msecs, source_filename, source_linenum, callback, context);
 }
 
 #undef timeout_add_absolute
 struct timeout *
 timeout_add_absolute(const struct timeval *time,
+		     const char *source_filename,
 		     unsigned int source_linenum,
 		     timeout_callback_t *callback, void *context)
 {
 	struct timeout *timeout;
 
-	timeout = timeout_add_common(source_linenum, callback, context);
+	timeout = timeout_add_common(source_filename, source_linenum,
+				     callback, context);
 	timeout->one_shot = TRUE;
 	timeout->next_run = *time;
 
@@ -275,7 +284,8 @@
 	struct timeout *new_to;
 
 	new_to = timeout_add_common
-		(old_to->source_linenum, old_to->callback, old_to->context);
+		(old_to->source_filename, old_to->source_linenum,
+		 old_to->callback, old_to->context);
 	new_to->one_shot = old_to->one_shot;
 	new_to->msecs = old_to->msecs;
 	new_to->next_run = old_to->next_run;
@@ -691,8 +701,9 @@
 		struct io_file *io = ioloop->io_files;
 		struct io *_io = &io->io;
 
-		i_warning("I/O leak: %p (line %u, fd %d)",
+		i_warning("I/O leak: %p (%s:%u, fd %d)",
 			  (void *)io->io.callback,
+			  io->io.source_filename,
 			  io->io.source_linenum, io->fd);
 		io_remove(&_io);
 	}
@@ -701,7 +712,8 @@
 	array_foreach(&ioloop->timeouts_new, to_idx) {
 		struct timeout *to = *to_idx;
 
-		i_warning("Timeout leak: %p (line %u)", (void *)to->callback,
+		i_warning("Timeout leak: %p (%s:%u)", (void *)to->callback,
+			  to->source_filename,
 			  to->source_linenum);
 		timeout_free(to);
 	}
@@ -710,7 +722,8 @@
 	while ((item = priorityq_pop(ioloop->timeouts)) != NULL) {
 		struct timeout *to = (struct timeout *)item;
 
-		i_warning("Timeout leak: %p (line %u)", (void *)to->callback,
+		i_warning("Timeout leak: %p (%s:%u)", (void *)to->callback,
+			  to->source_filename,
 			  to->source_linenum);
 		timeout_free(to);
 	}
@@ -918,6 +931,7 @@
 
 	old_io_file = (struct io_file *)old_io;
 	new_io_file = io_add_file(old_io_file->fd, old_io->condition,
+				  old_io->source_filename,
 				  old_io->source_linenum,
 				  old_io->callback, old_io->context);
 	if (old_io_file->istream != NULL) {
--- a/src/lib/ioloop.h	Fri Sep 30 13:42:45 2016 +0300
+++ b/src/lib/ioloop.h	Mon Oct 03 09:11:23 2016 +0300
@@ -48,24 +48,27 @@
    Don't try to add multiple handlers for the same type. It's not checked and
    the behavior will be undefined. */
 struct io *io_add(int fd, enum io_condition condition,
+		  const char *source_filename,
 		  unsigned int source_linenum,
 		  io_callback_t *callback, void *context) ATTR_NULL(5);
 #define io_add(fd, condition, callback, context) \
-	io_add(fd, condition, __LINE__ + \
+	io_add(fd, condition, __FILE__, __LINE__ + \
 		CALLBACK_TYPECHECK(callback, void (*)(typeof(context))), \
 		(io_callback_t *)callback, context)
 enum io_notify_result
-io_add_notify(const char *path, unsigned int source_linenum,
+io_add_notify(const char *path, const char *source_filename,
+	      unsigned int source_linenum,
 	      io_callback_t *callback, void *context,
 	      struct io **io_r) ATTR_NULL(3);
 #define io_add_notify(path, callback, context, io_r) \
-	io_add_notify(path, __LINE__ + \
+	io_add_notify(path, __FILE__, __LINE__ + \
 		CALLBACK_TYPECHECK(callback, void (*)(typeof(context))), \
 		(io_callback_t *)callback, context, io_r)
-struct io *io_add_istream(struct istream *input, unsigned int source_linenum,
+struct io *io_add_istream(struct istream *input, const char *source_filename,
+			  unsigned int source_linenum,
 			  io_callback_t *callback, void *context) ATTR_NULL(3);
 #define io_add_istream(input, callback, context) \
-	io_add_istream(input, __LINE__ + \
+	io_add_istream(input, __FILE__, __LINE__ + \
 		CALLBACK_TYPECHECK(callback, void (*)(typeof(context))), \
 		(io_callback_t *)callback, context)
 
@@ -83,26 +86,29 @@
 
 /* Timeout handlers */
 struct timeout *
-timeout_add(unsigned int msecs, unsigned int source_linenum,
+timeout_add(unsigned int msecs, const char *source_filename,
+	    unsigned int source_linenum,
 	    timeout_callback_t *callback, void *context) ATTR_NULL(4);
 #define timeout_add(msecs, callback, context) \
-	timeout_add(msecs, __LINE__ + \
+	timeout_add(msecs, __FILE__, __LINE__ + \
 		CALLBACK_TYPECHECK(callback, void (*)(typeof(context))) + \
 		COMPILE_ERROR_IF_TRUE(__builtin_constant_p(msecs) && \
 				      (msecs > 0 && msecs < 1000)), \
 		(io_callback_t *)callback, context)
 struct timeout *
-timeout_add_short(unsigned int msecs, unsigned int source_linenum,
+timeout_add_short(unsigned int msecs, const char *source_filename,
+		  unsigned int source_linenum,
 		  timeout_callback_t *callback, void *context) ATTR_NULL(4);
 #define timeout_add_short(msecs, callback, context) \
-	timeout_add_short(msecs, __LINE__ + \
+	timeout_add_short(msecs, __FILE__, __LINE__ + \
 		CALLBACK_TYPECHECK(callback, void (*)(typeof(context))), \
 		(io_callback_t *)callback, context)
 struct timeout *timeout_add_absolute(const struct timeval *time,
+			    const char *source_filename,
 			    unsigned int source_linenum,
 			    timeout_callback_t *callback, void *context) ATTR_NULL(4);
 #define timeout_add_absolute(time, callback, context) \
-	timeout_add_absolute(time, __LINE__ + \
+	timeout_add_absolute(time, __FILE__, __LINE__ + \
 		CALLBACK_TYPECHECK(callback, void (*)(typeof(context))), \
 		(io_callback_t *)callback, context)
 /* Remove timeout handler, and set timeout pointer to NULL. */