void serf_debug__bucket_destroy()

in buckets/allocator.c [469:526]


void serf_debug__bucket_destroy(const serf_bucket_t *bucket)
{
#ifdef SERF_DEBUG_BUCKET_USE

    track_state_t *track = bucket->allocator->track;
    read_status_t *rs = find_read_status(track, bucket, 0);

    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.
         */
        if (SERF_BUCKET_IS_SOCKET(bucket))
            return;

        /* Ditto for SSL Decrypt buckets. */
        if (SERF_BUCKET_IS_SSL_DECRYPT(bucket))
            return;

        /* Ditto for SSL Encrypt buckets. */
        if (SERF_BUCKET_IS_SSL_ENCRYPT(bucket))
            return;

        /* Ditto for barrier buckets. */
        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();
    }

#endif
}