Author: rhuijben
Date: Thu Nov 5 14:36:59 2015
New Revision: 1712786
URL: http://svn.apache.org/viewvc?rev=1712786&view=rev
Log:
Following up on r1712776, reduce the strict dependency on polling for
cleanup of finished request by also explicitly setting the writing
status to DONE via a hold_open callback.
A specific hold open bucket would be useful :).
* outgoing.c
(request_writing_finished): New function.
(write_to_connection): Setup callback when a request is done.
Modified:
serf/trunk/outgoing.c
Modified: serf/trunk/outgoing.c
URL:
http://svn.apache.org/viewvc/serf/trunk/outgoing.c?rev=1712786&r1=1712785&r2=1712786&view=diff
==============================================================================
--- serf/trunk/outgoing.c (original)
+++ serf/trunk/outgoing.c Thu Nov 5 14:36:59 2015
@@ -896,6 +896,19 @@ apr_status_t serf__connection_flush(serf
return status ? status : read_status;
}
+/* Implements serf_bucket_aggregate_eof_t to mark that the request that is
+ already DONE writing has actually FINISHED writing. */
+static apr_status_t request_writing_finished(void *baton,
+ serf_bucket_t *aggregate_bucket)
+{
+ serf_request_t *request = baton;
+
+ if (request->writing == SERF_WRITING_DONE)
+ request->writing = SERF_WRITING_FINISHED;
+
+ return APR_EOF;
+}
+
/* write data out to the connection */
static apr_status_t write_to_connection(serf_connection_t *conn)
{
@@ -992,6 +1005,7 @@ static apr_status_t write_to_connection(
return status;
if (request && conn->hit_eof && conn->vec_len == 0) {
+ serf_bucket_t *trk_bkt;
/* If we hit the end of the request bucket and all of its data has
* been written, then clear it out to signify that we're done
* sending the request. On the next iteration through this loop:
@@ -1002,6 +1016,15 @@ static apr_status_t write_to_connection(
*/
request->writing = SERF_WRITING_DONE;
+ /* We don't know when the request writing is finished, but we know
+ how to track that... Let's introduce a callback that is called
+ when we write again */
+ /* ### More efficient to use other bucket type? */
+ trk_bkt = serf_bucket_aggregate_create(conn->allocator);
+ serf_bucket_aggregate_hold_open(trk_bkt, request_writing_finished,
+ request);
+ serf_bucket_aggregate_prepend(ostreamt, trk_bkt);
+
/* Move the request to the written queue */
serf__link_requests(&conn->written_reqs, &conn->written_reqs_tail,
request);