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
 };
 
 


Reply via email to