void aws_s3_meta_request_finish_default()

in source/s3_meta_request.c [1104:1180]


void aws_s3_meta_request_finish_default(struct aws_s3_meta_request *meta_request) {
    AWS_PRECONDITION(meta_request);

    bool already_finished = false;
    struct aws_linked_list release_request_list;
    aws_linked_list_init(&release_request_list);

    struct aws_s3_meta_request_result finish_result;
    AWS_ZERO_STRUCT(finish_result);

    aws_s3_meta_request_lock_synced_data(meta_request);

    if (meta_request->synced_data.state == AWS_S3_META_REQUEST_STATE_FINISHED) {
        already_finished = true;
        goto unlock;
    }

    meta_request->synced_data.state = AWS_S3_META_REQUEST_STATE_FINISHED;

    /* Clean out the pending-stream-to-caller priority queue*/
    while (aws_priority_queue_size(&meta_request->synced_data.pending_body_streaming_requests) > 0) {
        struct aws_s3_request *request = NULL;
        aws_priority_queue_pop(&meta_request->synced_data.pending_body_streaming_requests, (void **)&request);
        AWS_FATAL_ASSERT(request != NULL);

        aws_linked_list_push_back(&release_request_list, &request->node);
    }

    finish_result = meta_request->synced_data.finish_result;
    AWS_ZERO_STRUCT(meta_request->synced_data.finish_result);

unlock:
    aws_s3_meta_request_unlock_synced_data(meta_request);

    if (already_finished) {
        return;
    }

    while (!aws_linked_list_empty(&release_request_list)) {
        struct aws_linked_list_node *request_node = aws_linked_list_pop_front(&release_request_list);
        struct aws_s3_request *release_request = AWS_CONTAINER_OF(request_node, struct aws_s3_request, node);
        AWS_FATAL_ASSERT(release_request != NULL);
        aws_s3_request_release(release_request);
    }

    if (meta_request->headers_callback && finish_result.error_response_headers) {
        if (meta_request->headers_callback(
                meta_request,
                finish_result.error_response_headers,
                finish_result.response_status,
                meta_request->user_data)) {
            finish_result.error_code = aws_last_error_or_unknown();
        }
        meta_request->headers_callback = NULL;
    }

    AWS_LOGF_DEBUG(
        AWS_LS_S3_META_REQUEST,
        "id=%p Meta request finished with error code %d (%s)",
        (void *)meta_request,
        finish_result.error_code,
        aws_error_str(finish_result.error_code));

    if (meta_request->finish_callback != NULL) {
        meta_request->finish_callback(meta_request, &finish_result, meta_request->user_data);
    }

    aws_s3_meta_request_result_clean_up(meta_request, &finish_result);

    aws_s3_endpoint_release(meta_request->endpoint);
    meta_request->endpoint = NULL;

    aws_s3_client_release(meta_request->client);
    meta_request->client = NULL;

    meta_request->io_event_loop = NULL;
}