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