in source/s3_default_meta_request.c [117:208]
static bool s_s3_meta_request_default_update(
struct aws_s3_meta_request *meta_request,
uint32_t flags,
struct aws_s3_request **out_request) {
(void)flags;
AWS_PRECONDITION(meta_request);
AWS_PRECONDITION(out_request);
struct aws_s3_meta_request_default *meta_request_default = meta_request->impl;
struct aws_s3_request *request = NULL;
bool work_remaining = false;
aws_s3_meta_request_lock_synced_data(meta_request);
if (!aws_s3_meta_request_has_finish_result_synced(meta_request)) {
/* If the request hasn't been sent, then create and send it now. */
if (!meta_request_default->synced_data.request_sent) {
if (out_request == NULL) {
goto has_work_remaining;
}
request = aws_s3_request_new(meta_request, 0, 1, AWS_S3_REQUEST_FLAG_RECORD_RESPONSE_HEADERS);
AWS_LOGF_DEBUG(
AWS_LS_S3_META_REQUEST,
"id=%p: Meta Request Default created request %p",
(void *)meta_request,
(void *)request);
meta_request_default->synced_data.request_sent = true;
goto has_work_remaining;
}
/* If the request hasn't been completed, then wait for it to be completed. */
if (!meta_request_default->synced_data.request_completed) {
goto has_work_remaining;
}
/* If delivery hasn't been attempted yet for the response body, wait for that to happen. */
if (meta_request->synced_data.num_parts_delivery_completed < 1) {
goto has_work_remaining;
}
goto no_work_remaining;
} else {
/* If we are canceling, and the request hasn't been sent yet, then there is nothing to wait for. */
if (!meta_request_default->synced_data.request_sent) {
goto no_work_remaining;
}
/* If the request hasn't been completed yet, then wait for that to happen. */
if (!meta_request_default->synced_data.request_completed) {
goto has_work_remaining;
}
/* If some parts are still being delievered to the caller, then wait for those to finish. */
if (meta_request->synced_data.num_parts_delivery_completed <
meta_request->synced_data.num_parts_delivery_sent) {
goto has_work_remaining;
}
goto no_work_remaining;
}
has_work_remaining:
work_remaining = true;
no_work_remaining:
if (!work_remaining) {
aws_s3_meta_request_set_success_synced(meta_request, meta_request_default->synced_data.cached_response_status);
}
aws_s3_meta_request_unlock_synced_data(meta_request);
if (work_remaining) {
if (request != NULL) {
AWS_ASSERT(out_request != NULL);
*out_request = request;
}
} else {
AWS_ASSERT(request == NULL);
aws_s3_meta_request_finish(meta_request);
}
return work_remaining;
}