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