dovecot-2.2: lib-http server: Delay calling the request's destro...

dovecot at dovecot.org dovecot at dovecot.org
Tue Aug 12 10:14:04 UTC 2014


details:   http://hg.dovecot.org/dovecot-2.2/rev/40b07d1f7f6a
changeset: 17705:40b07d1f7f6a
user:      Timo Sirainen <tss at iki.fi>
date:      Tue Aug 12 13:12:01 2014 +0300
description:
lib-http server: Delay calling the request's destroy callback until handle_request() callback is finished.
This simplifies the code in the handle_request() so it doesn't need to keep
track of whether the response is already submitted or not.

diffstat:

 src/lib-http/http-server-connection.c |  12 ++++++++++--
 src/lib-http/http-server-private.h    |   2 ++
 src/lib-http/http-server-request.c    |   4 +++-
 3 files changed, 15 insertions(+), 3 deletions(-)

diffs (58 lines):

diff -r 37eff3debe38 -r 40b07d1f7f6a src/lib-http/http-server-connection.c
--- a/src/lib-http/http-server-connection.c	Tue Aug 12 12:39:46 2014 +0300
+++ b/src/lib-http/http-server-connection.c	Tue Aug 12 13:12:01 2014 +0300
@@ -440,18 +440,26 @@
 			conn->stats.request_count++;
 
 			http_server_request_ref(req);
+			i_assert(!req->delay_destroy);
+			req->delay_destroy = TRUE;
 			T_BEGIN {
 				cont = http_server_connection_handle_request(conn, req);
 			} T_END;
 			if (!cont) {
 				/* connection closed or request body not read yet.
 				   the request may be destroyed now. */
-				http_server_request_unref(&req);
+				if (req->destroy_pending)
+					http_server_request_destroy(&req);
+				else
+					http_server_request_unref(&req);
 				return;
 			}
 			if (req->req.connection_close)
 				conn->close_indicated = TRUE;
-			http_server_request_unref(&req);
+			if (req->destroy_pending)
+				http_server_request_destroy(&req);
+			else
+				http_server_request_unref(&req);
 		
 			/* client indicated it will close after this request; stop trying
 			   to read more. */			   
diff -r 37eff3debe38 -r 40b07d1f7f6a src/lib-http/http-server-private.h
--- a/src/lib-http/http-server-private.h	Tue Aug 12 12:39:46 2014 +0300
+++ b/src/lib-http/http-server-private.h	Tue Aug 12 13:12:01 2014 +0300
@@ -82,6 +82,8 @@
 
 	unsigned int payload_halted:1;
 	unsigned int sent_100_continue:1;
+	unsigned int delay_destroy:1;
+	unsigned int destroy_pending:1;
 	unsigned int failed:1;
 };
 
diff -r 37eff3debe38 -r 40b07d1f7f6a src/lib-http/http-server-request.c
--- a/src/lib-http/http-server-request.c	Tue Aug 12 12:39:46 2014 +0300
+++ b/src/lib-http/http-server-request.c	Tue Aug 12 13:12:01 2014 +0300
@@ -59,7 +59,9 @@
 {
 	struct http_server_request *req = *_req;
 
-	if (req->destroy_callback != NULL) {
+	if (req->delay_destroy) {
+		req->destroy_pending = TRUE;
+	} else if (req->destroy_callback != NULL) {
 		req->destroy_callback(req->destroy_context);
 		req->destroy_callback = NULL;
 	}


More information about the dovecot-cvs mailing list