Skip to content

Commit 74a8876

Browse files
laramielcopybara-github
authored andcommitted
aws: Consolidate aws library initialization to a single function.
PiperOrigin-RevId: 745829624 Change-Id: I59930f069ac26a5e3498b846ab98ca829f3c6ff6
1 parent cc139da commit 74a8876

File tree

2 files changed

+49
-37
lines changed

2 files changed

+49
-37
lines changed

tensorstore/internal/aws/BUILD

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,9 @@ tensorstore_cc_library(
1616
":tls_ctx",
1717
"//tensorstore/internal/log:verbose_flag",
1818
"@aws_c_auth",
19+
"@aws_c_cal",
1920
"@aws_c_common",
21+
"@aws_c_http",
2022
"@aws_c_io",
2123
"@com_google_absl//absl/base",
2224
"@com_google_absl//absl/base:core_headers",

tensorstore/internal/aws/aws_api.cc

Lines changed: 47 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414

1515
#include "tensorstore/internal/aws/aws_api.h"
1616

17+
#include <stddef.h>
1718
#include <stdint.h>
1819

1920
#include <cstdarg>
@@ -27,11 +28,13 @@
2728
#include "absl/debugging/leak_check.h"
2829
#include "absl/log/absl_log.h"
2930
#include <aws/auth/auth.h>
31+
#include <aws/cal/cal.h>
3032
#include <aws/common/allocator.h>
3133
#include <aws/common/common.h>
3234
#include <aws/common/error.h>
3335
#include <aws/common/logging.h>
3436
#include <aws/common/zero.h>
37+
#include <aws/http/http.h>
3538
#include <aws/io/channel_bootstrap.h>
3639
#include <aws/io/event_loop.h>
3740
#include <aws/io/host_resolver.h>
@@ -117,67 +120,76 @@ int absl_set_log_level(aws_logger *logger, aws_log_level lvl) {
117120

118121
void absl_clean_up(aws_logger *logger) { (void)logger; }
119122

120-
static aws_logger_vtable s_absl_vtable = {
121-
/*log =*/absl_log,
122-
/*get_log_level =*/absl_get_log_level,
123-
/*clean_up =*/absl_clean_up,
124-
/*set_log_level =*/absl_set_log_level,
123+
// Some C++ compiler targets don't like designated initializers in C++, until
124+
// they are supported static_assert() on the offsets
125+
static_assert(offsetof(aws_logger_vtable, log) == 0);
126+
static_assert(offsetof(aws_logger_vtable, get_log_level) == sizeof(void *));
127+
static_assert(offsetof(aws_logger_vtable, clean_up) == 2 * sizeof(void *));
128+
static_assert(offsetof(aws_logger_vtable, set_log_level) == 3 * sizeof(void *));
129+
130+
static_assert(offsetof(aws_logger, vtable) == 0);
131+
static_assert(offsetof(aws_logger, allocator) == sizeof(void *));
132+
static_assert(offsetof(aws_logger, p_impl) == 2 * sizeof(void *));
133+
134+
ABSL_CONST_INIT aws_logger_vtable s_absl_vtable{
135+
/*.log=*/absl_log,
136+
/*.get_log_level=*/absl_get_log_level,
137+
/*.clean_up=*/absl_clean_up,
138+
/*.set_log_level=*/absl_set_log_level,
125139
};
126140

127-
static aws_logger s_absl_logger = {
128-
/*vtable =*/&s_absl_vtable,
129-
/*.allocator =*/nullptr,
130-
/*.p_impl =*/0,
141+
aws_logger s_absl_logger{
142+
/*.vtable=*/&s_absl_vtable,
143+
/*.allocator=*/nullptr,
144+
/*.p_impl=*/nullptr,
131145
};
132146

133147
// AWS apis rely on global initialization; do that here.
134-
absl::once_flag g_init_global;
135-
aws_allocator *g_allocator = nullptr;
148+
ABSL_CONST_INIT absl::once_flag g_init;
136149

137-
void InitAwsGlobal() {
138-
absl::LeakCheckDisabler disabler;
139-
aws_logger_set(&s_absl_logger);
140-
g_allocator = aws_default_allocator();
141-
142-
// Initialize the AWS APIs used.
143-
aws_common_library_init(g_allocator);
144-
aws_io_library_init(g_allocator);
145-
aws_auth_library_init(g_allocator);
146-
}
147-
148-
// Also initialize a global client bootstrap and TLS context.
149-
absl::once_flag g_init_tls;
150150
aws_event_loop_group *g_event_loop_group = nullptr;
151151
aws_host_resolver *g_resolver = nullptr;
152152
aws_client_bootstrap *g_client_bootstrap = nullptr;
153153
aws_tls_ctx *g_tls_ctx = nullptr;
154154

155-
void InitAwsTls() {
155+
void InitAwsLibraries() {
156156
absl::LeakCheckDisabler disabler;
157+
158+
auto *allocator = GetAwsAllocator();
159+
160+
/* Initialize AWS libraries.*/
161+
aws_common_library_init(allocator);
162+
163+
s_absl_logger.allocator = allocator;
164+
aws_logger_set(&s_absl_logger);
165+
166+
aws_cal_library_init(allocator);
167+
aws_io_library_init(allocator);
168+
aws_http_library_init(allocator);
169+
aws_auth_library_init(allocator);
170+
157171
/* event loop */
158-
g_event_loop_group =
159-
aws_event_loop_group_new_default(g_allocator, 0, nullptr);
172+
g_event_loop_group = aws_event_loop_group_new_default(allocator, 0, nullptr);
160173

161174
/* resolver */
162175
aws_host_resolver_default_options resolver_options;
163176
AWS_ZERO_STRUCT(resolver_options);
164177
resolver_options.el_group = g_event_loop_group;
165178
resolver_options.max_entries = 32; // defaults to 8?
166-
g_resolver = aws_host_resolver_new_default(g_allocator, &resolver_options);
179+
g_resolver = aws_host_resolver_new_default(allocator, &resolver_options);
167180

168181
/* client bootstrap */
169182
aws_client_bootstrap_options bootstrap_options;
170183
AWS_ZERO_STRUCT(bootstrap_options);
171184
bootstrap_options.event_loop_group = g_event_loop_group;
172185
bootstrap_options.host_resolver = g_resolver;
173-
g_client_bootstrap =
174-
aws_client_bootstrap_new(g_allocator, &bootstrap_options);
186+
g_client_bootstrap = aws_client_bootstrap_new(allocator, &bootstrap_options);
175187
if (g_client_bootstrap == nullptr) {
176188
ABSL_LOG(FATAL) << "ERROR initializing client bootstrap: "
177189
<< aws_error_debug_str(aws_last_error());
178190
}
179191

180-
AwsTlsCtx tls_ctx = AwsTlsCtxBuilder(g_allocator).Build();
192+
AwsTlsCtx tls_ctx = AwsTlsCtxBuilder(allocator).Build();
181193
if (tls_ctx == nullptr) {
182194
ABSL_LOG(FATAL) << "ERROR initializing TLS context: "
183195
<< aws_error_debug_str(aws_last_error());
@@ -188,19 +200,17 @@ void InitAwsTls() {
188200
} // namespace
189201

190202
aws_allocator *GetAwsAllocator() {
191-
absl::call_once(g_init_global, InitAwsGlobal);
192-
return g_allocator;
203+
// The default allocator is used for all AWS API objects.
204+
return aws_default_allocator();
193205
}
194206

195207
aws_client_bootstrap *GetAwsClientBootstrap() {
196-
absl::call_once(g_init_global, InitAwsGlobal);
197-
absl::call_once(g_init_tls, InitAwsTls);
208+
absl::call_once(g_init, InitAwsLibraries);
198209
return g_client_bootstrap;
199210
}
200211

201212
aws_tls_ctx *GetAwsTlsCtx() {
202-
absl::call_once(g_init_global, InitAwsGlobal);
203-
absl::call_once(g_init_tls, InitAwsTls);
213+
absl::call_once(g_init, InitAwsLibraries);
204214
return g_tls_ctx;
205215
}
206216

0 commit comments

Comments
 (0)