1414
1515#include " tensorstore/internal/aws/aws_api.h"
1616
17+ #include < stddef.h>
1718#include < stdint.h>
1819
1920#include < cstdarg>
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
118121void 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;
150150aws_event_loop_group *g_event_loop_group = nullptr ;
151151aws_host_resolver *g_resolver = nullptr ;
152152aws_client_bootstrap *g_client_bootstrap = nullptr ;
153153aws_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
190202aws_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
195207aws_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
201212aws_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