in source/credentials_provider_cached.c [148:215]
static int s_cached_credentials_provider_get_credentials_async(
struct aws_credentials_provider *provider,
aws_on_get_credentials_callback_fn callback,
void *user_data) {
struct aws_credentials_provider_cached *impl = provider->impl;
uint64_t current_time = 0;
impl->high_res_clock_fn(¤t_time);
bool should_submit_query = false;
bool perform_callback = false;
struct aws_credentials *credentials = NULL;
aws_mutex_lock(&impl->lock);
if (impl->cached_credentials != NULL && current_time < impl->next_refresh_time) {
perform_callback = true;
credentials = impl->cached_credentials;
aws_credentials_acquire(credentials);
} else {
struct aws_credentials_query *query =
aws_mem_acquire(provider->allocator, sizeof(struct aws_credentials_query));
if (query != NULL) {
aws_credentials_query_init(query, provider, callback, user_data);
should_submit_query = aws_linked_list_empty(&impl->pending_queries);
aws_linked_list_push_back(&impl->pending_queries, &query->node);
} else {
perform_callback = true;
}
}
aws_mutex_unlock(&impl->lock);
if (should_submit_query) {
AWS_LOGF_INFO(
AWS_LS_AUTH_CREDENTIALS_PROVIDER,
"(id=%p) Cached credentials provider has expired credentials. Requerying.",
(void *)provider);
aws_credentials_provider_get_credentials(
impl->source, s_cached_credentials_provider_get_credentials_async_callback, provider);
} else if (!perform_callback) {
AWS_LOGF_DEBUG(
AWS_LS_AUTH_CREDENTIALS_PROVIDER,
"(id=%p) Cached credentials provider has expired credentials. Waiting on existing query.",
(void *)provider);
}
if (perform_callback) {
if (credentials != NULL) {
AWS_LOGF_DEBUG(
AWS_LS_AUTH_CREDENTIALS_PROVIDER,
"(id=%p) Cached credentials provider successfully sourced from cache",
(void *)provider);
} else {
AWS_LOGF_DEBUG(
AWS_LS_AUTH_CREDENTIALS_PROVIDER,
"(id=%p) Cached credentials provider failed to source credentials while skipping requery",
(void *)provider);
}
callback(credentials, (credentials != NULL) ? AWS_ERROR_SUCCESS : aws_last_error(), user_data);
aws_credentials_release(credentials);
}
return AWS_OP_SUCCESS;
}