in src/outgoing.c [1372:1439]
apr_status_t serf_connection_close(
serf_connection_t *conn)
{
int i;
serf_context_t *ctx = conn->ctx;
apr_status_t status;
for (i = ctx->conns->nelts; i--; ) {
serf_connection_t *conn_seq = GET_CONN(ctx, i);
if (conn_seq == conn) {
/* Clean up the write bucket first, as this marks all partially written
requests as fully written, allowing more efficient cleanup */
serf__connection_pre_cleanup(conn);
if (conn->protocol_baton && conn->perform_pre_teardown)
conn->perform_pre_teardown(conn);
/* The application asked to close the connection, no need to notify
it for each cancelled request. */
while (conn->written_reqs) {
serf__cancel_request(conn->written_reqs, &conn->written_reqs, 0);
}
while (conn->unwritten_reqs) {
serf__cancel_request(conn->unwritten_reqs, &conn->unwritten_reqs, 0);
}
if (conn->skt != NULL) {
remove_connection(ctx, conn);
status = clean_skt(conn);
if (conn->closed != NULL) {
handle_conn_closed(conn, status);
}
}
if (conn->pump.stream != NULL) {
serf_bucket_destroy(conn->pump.stream);
conn->pump.stream = NULL;
}
if (conn->protocol_baton) {
conn->perform_teardown(conn);
conn->protocol_baton = NULL;
}
/* Remove the connection from the context. We don't want to
* deal with it any more.
*/
if (i < ctx->conns->nelts - 1) {
/* move later connections over this one. */
memmove(
&GET_CONN(ctx, i),
&GET_CONN(ctx, i + 1),
(ctx->conns->nelts - i - 1) * sizeof(serf_connection_t *));
}
--ctx->conns->nelts;
serf__log(LOGLVL_DEBUG, LOGCOMP_CONN, __FILE__, conn->config,
"closed connection 0x%p\n", conn);
/* Found the connection. Closed it. All done. */
return APR_SUCCESS;
}
}
/* We didn't find the specified connection. */
/* ### doc talks about this w.r.t poll structures. use something else? */
return APR_NOTFOUND;
}