in source/s3_meta_request.c [985:1053]
static void s_s3_meta_request_body_streaming_task(struct aws_task *task, void *arg, enum aws_task_status task_status) {
(void)task;
(void)task_status;
struct s3_stream_response_body_payload *payload = arg;
AWS_PRECONDITION(payload);
struct aws_s3_meta_request *meta_request = payload->meta_request;
AWS_PRECONDITION(meta_request);
AWS_PRECONDITION(meta_request->vtable);
struct aws_s3_client *client = meta_request->client;
AWS_PRECONDITION(client);
/* Client owns this event loop group. A cancel should not be possible. */
AWS_ASSERT(task_status == AWS_TASK_STATUS_RUN_READY);
struct aws_linked_list completed_requests;
aws_linked_list_init(&completed_requests);
int error_code = AWS_ERROR_SUCCESS;
uint32_t num_successful = 0;
uint32_t num_failed = 0;
while (!aws_linked_list_empty(&payload->requests)) {
struct aws_linked_list_node *request_node = aws_linked_list_pop_front(&payload->requests);
struct aws_s3_request *request = AWS_CONTAINER_OF(request_node, struct aws_s3_request, node);
AWS_ASSERT(meta_request == request->meta_request);
struct aws_byte_cursor body_buffer_byte_cursor = aws_byte_cursor_from_buf(&request->send_data.response_body);
AWS_ASSERT(request->part_number >= 1);
if (aws_s3_meta_request_has_finish_result(meta_request)) {
++num_failed;
} else {
if (error_code == AWS_ERROR_SUCCESS && meta_request->body_callback &&
meta_request->body_callback(
meta_request, &body_buffer_byte_cursor, request->part_range_start, meta_request->user_data)) {
error_code = aws_last_error_or_unknown();
}
if (error_code == AWS_ERROR_SUCCESS) {
++num_successful;
} else {
++num_failed;
}
}
aws_atomic_fetch_sub(&client->stats.num_requests_streaming, 1);
aws_s3_request_release(request);
}
aws_s3_meta_request_lock_synced_data(meta_request);
if (error_code != AWS_ERROR_SUCCESS) {
aws_s3_meta_request_set_fail_synced(meta_request, NULL, error_code);
}
meta_request->synced_data.num_parts_delivery_completed += (num_failed + num_successful);
meta_request->synced_data.num_parts_delivery_failed += num_failed;
meta_request->synced_data.num_parts_delivery_succeeded += num_successful;
aws_s3_meta_request_unlock_synced_data(meta_request);
aws_mem_release(client->allocator, payload);
payload = NULL;
aws_s3_client_schedule_process_work(client);
aws_s3_meta_request_release(meta_request);
}