Author: rhuijben
Date: Wed Nov 11 21:29:45 2015
New Revision: 1713936
URL: http://svn.apache.org/viewvc?rev=1713936&view=rev
Log:
Resolve some SERF_DEBUG_BUCKET_USE related issues. This should make the
code usable agai.
* buckets/allocator.c
(serf_debug__record_read): Reduce to writing an error.
(serf_debug__bucket_destroy): Allow destroying errored buckets.
Work around an installed hold_open.
* buckets/log_wrapper_buckets.c
(serf__bucket_log_wrapper_create): Disable log wrapping bucket
when using SERF_DEBUG_BUCKET_USE, as serf_debug__bucket_destroy
can't detect when not to abort when a wrapper is used.
* outgoing.c
(check_buckets_drained): Use a field that exists.
(serf__connection_pre_cleanup): Drain bucket to avoid false warnings
on pool cleanup.
(request_writing_finished): Reset variable.
* test/mock_buckets.c
(serf_mock_destroy): New function. Destroy buck.
(serf_bucket_type_mock): Register destroy function.
Modified:
serf/trunk/buckets/allocator.c
serf/trunk/buckets/log_wrapper_buckets.c
serf/trunk/outgoing.c
serf/trunk/test/mock_buckets.c
Modified: serf/trunk/buckets/allocator.c
URL:
http://svn.apache.org/viewvc/serf/trunk/buckets/allocator.c?rev=1713936&r1=1713935&r2=1713936&view=diff
==============================================================================
--- serf/trunk/buckets/allocator.c (original)
+++ serf/trunk/buckets/allocator.c Wed Nov 11 21:29:45 2015
@@ -416,9 +416,11 @@ apr_status_t serf_debug__record_read(
read_status_t *rs = find_read_status(track, bucket, 1);
/* Validate that the previous status value allowed for another read. */
- if (APR_STATUS_IS_EAGAIN(rs->last) /* ### or APR_EOF? */) {
+ if (SERF_BUCKET_READ_ERROR(rs->last)) {
/* Somebody read when they weren't supposed to. Bail. */
- abort();
+ /*abort(); */
+ fprintf(stderr, "Should not read from %p again, last_status=%d,
status=%d\n",
+ bucket, rs->last, status);
}
/* Save the current status for later. */
@@ -471,9 +473,12 @@ void serf_debug__bucket_destroy(const se
track_state_t *track = bucket->allocator->track;
read_status_t *rs = find_read_status(track, bucket, 0);
- if (rs != NULL && rs->last != APR_EOF) {
+ if (rs != NULL
+ && !APR_STATUS_IS_EOF(rs->last)
+ && !SERF_BUCKET_READ_ERROR(rs->last)) {
/* The bucket was destroyed before it was read to completion. */
+ serf_bucket_t *bkt;
/* Special exception for socket buckets. If a connection remains
* open, they are not read to completion.
*/
@@ -492,6 +497,27 @@ void serf_debug__bucket_destroy(const se
if (SERF_BUCKET_IS_BARRIER(bucket))
return;
+ if (SERF_BUCKET_IS_AGGREGATE(bucket)) {
+ apr_status_t status;
+ const char *data;
+ apr_size_t len;
+
+ serf_bucket_aggregate_hold_open(bucket, NULL, NULL);
+
+ status = serf_bucket_read(bucket, SERF_READ_ALL_AVAIL,
+ &data, &len);
+
+ if (APR_STATUS_IS_EOF(status) && !len)
+ return;
+ }
+
+ bkt = serf_bucket_read_bucket((serf_bucket_t*)bucket,
+ &serf_bucket_type_ssl_encrypt);
+
+ if (bkt != NULL) {
+ serf_bucket_destroy(bkt);
+ return;
+ }
abort();
}
Modified: serf/trunk/buckets/log_wrapper_buckets.c
URL:
http://svn.apache.org/viewvc/serf/trunk/buckets/log_wrapper_buckets.c?rev=1713936&r1=1713935&r2=1713936&view=diff
==============================================================================
--- serf/trunk/buckets/log_wrapper_buckets.c (original)
+++ serf/trunk/buckets/log_wrapper_buckets.c Wed Nov 11 21:29:45 2015
@@ -147,7 +147,11 @@ serf_bucket_t *serf__bucket_log_wrapper_
const char *prefix,
serf_bucket_alloc_t *alloc)
{
-#ifdef SERF_LOGGING_ENABLED
+ /* ### This code currently breaks SERF_BUCKET_IS_XXXX() on the bucket.
+ So to avoid many false warnings we disable it when using
+ SERF_DEBUG_BUCKET_USE
+ */
+#if defined(SERF_LOGGING_ENABLED) && !defined(SERF_DEBUG_BUCKET_USE)
serf_log_wrapped_bucket_t *bkt = serf_bucket_mem_alloc(alloc,
sizeof(*bkt));
log_wrapped_context_t *ctx = serf_bucket_mem_alloc(alloc, sizeof(*ctx));
serf_bucket_type_t *bkt_type = serf_bucket_mem_alloc(alloc,
sizeof(*bkt_type));
Modified: serf/trunk/outgoing.c
URL:
http://svn.apache.org/viewvc/serf/trunk/outgoing.c?rev=1713936&r1=1713935&r2=1713936&view=diff
==============================================================================
--- serf/trunk/outgoing.c (original)
+++ serf/trunk/outgoing.c Wed Nov 11 21:29:45 2015
@@ -267,7 +267,7 @@ apr_status_t serf__conn_update_pollset(s
/* Make sure all response buckets were drained. */
static void check_buckets_drained(serf_connection_t *conn)
{
- serf_request_t *request = conn->requests;
+ serf_request_t *request = conn->written_reqs;
for ( ; request ; request = request->next ) {
if (request->resp_bkt != NULL) {
@@ -291,6 +291,9 @@ void serf__connection_pre_cleanup(serf_c
conn->vec_len = 0;
if (conn->ostream_head != NULL) {
+#ifdef SERF_DEBUG_BUCKET_USE
+ serf__bucket_drain(conn->ostream_head);
+#endif
serf_bucket_destroy(conn->ostream_head);
conn->ostream_head = NULL;
conn->ostream_tail = NULL;
@@ -922,6 +925,8 @@ static apr_status_t request_writing_fini
serf_request_t *request = baton;
serf_connection_t *conn = request->conn;
+ request->req_bkt = NULL; /* Bucket is destroyed by now */
+
if (request->writing == SERF_WRITING_DONE) {
request->writing = SERF_WRITING_FINISHED;
Modified: serf/trunk/test/mock_buckets.c
URL:
http://svn.apache.org/viewvc/serf/trunk/test/mock_buckets.c?rev=1713936&r1=1713935&r2=1713936&view=diff
==============================================================================
--- serf/trunk/test/mock_buckets.c (original)
+++ serf/trunk/test/mock_buckets.c Wed Nov 11 21:29:45 2015
@@ -189,6 +189,17 @@ apr_status_t serf_bucket_mock_more_data_
return APR_SUCCESS;
}
+void serf_mock_destroy(serf_bucket_t *bucket)
+{
+#ifndef SERF_DEBUG_BUCKET_USE
+ serf_default_destroy_and_data(bucket);
+#else
+ /* This bucket is impossible to drain. Avoid abort() */
+ serf_bucket_mem_free(bucket->allocator, bucket->data);
+ serf_bucket_mem_free(bucket->allocator, bucket);
+#endif
+}
+
const serf_bucket_type_t serf_bucket_type_mock = {
"MOCK",
serf_mock_read,
@@ -197,7 +208,7 @@ const serf_bucket_type_t serf_bucket_typ
serf_default_read_for_sendfile,
serf_default_read_bucket,
serf_mock_peek,
- serf_default_destroy_and_data,
+ serf_mock_destroy
};