grpc 1.47.0 → 1.48.0.pre1
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of grpc might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/Makefile +105 -47
- data/include/grpc/compression.h +1 -1
- data/include/grpc/event_engine/event_engine.h +20 -11
- data/include/grpc/event_engine/slice_buffer.h +8 -2
- data/include/grpc/grpc.h +3 -3
- data/include/grpc/impl/codegen/compression_types.h +2 -1
- data/include/grpc/impl/codegen/connectivity_state.h +2 -1
- data/include/grpc/impl/codegen/gpr_types.h +2 -1
- data/include/grpc/impl/codegen/grpc_types.h +2 -1
- data/include/grpc/impl/codegen/port_platform.h +6 -3
- data/src/core/ext/filters/census/grpc_context.cc +3 -0
- data/src/core/ext/filters/channel_idle/channel_idle_filter.cc +17 -5
- data/src/core/ext/filters/channel_idle/channel_idle_filter.h +16 -0
- data/src/core/ext/filters/channel_idle/idle_filter_state.h +2 -0
- data/src/core/ext/filters/client_channel/backup_poller.cc +3 -1
- data/src/core/ext/filters/client_channel/channel_connectivity.cc +2 -2
- data/src/core/ext/filters/client_channel/client_channel.cc +51 -65
- data/src/core/ext/filters/client_channel/client_channel.h +19 -4
- data/src/core/ext/filters/client_channel/config_selector.h +1 -1
- data/src/core/ext/filters/client_channel/connector.h +1 -1
- data/src/core/ext/filters/client_channel/dynamic_filters.cc +6 -4
- data/src/core/ext/filters/client_channel/dynamic_filters.h +1 -1
- data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +1 -1
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +2 -2
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.h +1 -0
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +73 -43
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc +1 -1
- data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.cc +0 -1
- data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.cc +33 -35
- data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +106 -112
- data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +91 -42
- data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +177 -138
- data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.h +4 -1
- data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +47 -44
- data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +118 -103
- data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +83 -78
- data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +57 -67
- data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +2 -2
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +5 -7
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +13 -17
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +3 -3
- data/src/core/ext/filters/client_channel/lb_policy.h +0 -7
- data/src/core/ext/filters/client_channel/lb_policy_registry.cc +3 -5
- data/src/core/ext/filters/client_channel/proxy_mapper_registry.cc +0 -1
- data/src/core/ext/filters/client_channel/resolver/binder/binder_resolver.cc +3 -1
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +6 -6
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +5 -5
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +10 -5
- data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +12 -3
- data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +5 -5
- data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +3 -4
- data/src/core/ext/filters/client_channel/resolver/polling_resolver.cc +1 -1
- data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +1 -0
- data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +24 -15
- data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.h +3 -1
- data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +7 -7
- data/src/core/ext/filters/client_channel/retry_filter.cc +35 -36
- data/src/core/ext/filters/client_channel/retry_filter.h +1 -0
- data/src/core/ext/filters/client_channel/retry_service_config.cc +4 -4
- data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +2 -1
- data/src/core/ext/filters/client_channel/subchannel.cc +53 -50
- data/src/core/ext/filters/client_channel/subchannel.h +6 -22
- data/src/core/ext/filters/client_channel/subchannel_interface.h +10 -18
- data/src/core/ext/filters/client_channel/subchannel_stream_client.cc +12 -97
- data/src/core/ext/filters/client_channel/subchannel_stream_client.h +5 -9
- data/src/core/ext/filters/deadline/deadline_filter.cc +12 -7
- data/src/core/ext/filters/deadline/deadline_filter.h +8 -1
- data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +21 -2
- data/src/core/ext/filters/fault_injection/fault_injection_filter.h +8 -3
- data/src/core/ext/filters/fault_injection/service_config_parser.cc +7 -4
- data/src/core/ext/filters/fault_injection/service_config_parser.h +17 -3
- data/src/core/ext/filters/http/client/http_client_filter.cc +16 -5
- data/src/core/ext/filters/http/client/http_client_filter.h +8 -1
- data/src/core/ext/filters/http/client_authority_filter.cc +11 -10
- data/src/core/ext/filters/http/client_authority_filter.h +5 -2
- data/src/core/ext/filters/http/http_filters_plugin.cc +9 -1
- data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +64 -187
- data/src/core/ext/filters/http/message_compress/message_compress_filter.h +1 -2
- data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +42 -106
- data/src/core/ext/filters/http/message_compress/message_decompress_filter.h +1 -0
- data/src/core/ext/filters/http/server/http_server_filter.cc +16 -9
- data/src/core/ext/filters/http/server/http_server_filter.h +6 -1
- data/src/core/ext/filters/message_size/message_size_filter.cc +25 -15
- data/src/core/ext/filters/message_size/message_size_filter.h +13 -0
- data/src/core/ext/filters/rbac/rbac_filter.cc +14 -3
- data/src/core/ext/filters/rbac/rbac_filter.h +8 -0
- data/src/core/ext/filters/rbac/rbac_service_config_parser.cc +13 -2
- data/src/core/ext/filters/rbac/rbac_service_config_parser.h +14 -2
- data/src/core/ext/filters/server_config_selector/server_config_selector.cc +1 -0
- data/src/core/ext/filters/server_config_selector/server_config_selector.h +9 -0
- data/src/core/ext/filters/server_config_selector/server_config_selector_filter.cc +22 -2
- data/src/core/ext/filters/server_config_selector/server_config_selector_filter.h +1 -0
- data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +4 -4
- data/src/core/ext/transport/chttp2/server/chttp2_server.cc +15 -15
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +196 -476
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +1 -1
- data/src/core/ext/transport/chttp2/transport/flow_control.cc +141 -261
- data/src/core/ext/transport/chttp2/transport/flow_control.h +176 -289
- data/src/core/ext/transport/chttp2/transport/frame_data.cc +57 -215
- data/src/core/ext/transport/chttp2/transport/frame_data.h +10 -36
- data/src/core/ext/transport/chttp2/transport/frame_settings.cc +0 -41
- data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +7 -12
- data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +7 -6
- data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +0 -2
- data/src/core/ext/transport/chttp2/transport/internal.h +9 -111
- data/src/core/ext/transport/chttp2/transport/parsing.cc +51 -38
- data/src/core/ext/transport/chttp2/transport/stream_lists.cc +0 -4
- data/src/core/ext/transport/chttp2/transport/writing.cc +18 -21
- data/src/core/ext/transport/inproc/inproc_plugin.cc +0 -1
- data/src/core/ext/transport/inproc/inproc_transport.cc +85 -81
- data/src/core/ext/transport/inproc/inproc_transport.h +3 -1
- data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/ring_hash/v3/ring_hash.upb.c +52 -0
- data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/ring_hash/v3/ring_hash.upb.h +164 -0
- data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/wrr_locality/v3/wrr_locality.upb.c +46 -0
- data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/wrr_locality/v3/wrr_locality.upb.h +94 -0
- data/src/core/ext/xds/certificate_provider_factory.h +6 -1
- data/src/core/ext/xds/certificate_provider_registry.cc +8 -8
- data/src/core/ext/xds/certificate_provider_registry.h +3 -1
- data/src/core/ext/xds/certificate_provider_store.cc +2 -0
- data/src/core/ext/xds/certificate_provider_store.h +9 -0
- data/src/core/ext/xds/file_watcher_certificate_provider_factory.cc +9 -0
- data/src/core/ext/xds/file_watcher_certificate_provider_factory.h +8 -0
- data/src/core/ext/xds/upb_utils.h +1 -2
- data/src/core/ext/xds/xds_api.cc +16 -18
- data/src/core/ext/xds/xds_api.h +12 -5
- data/src/core/ext/xds/xds_bootstrap.cc +37 -24
- data/src/core/ext/xds/xds_bootstrap.h +9 -11
- data/src/core/ext/xds/xds_certificate_provider.cc +12 -3
- data/src/core/ext/xds/xds_certificate_provider.h +16 -1
- data/src/core/ext/xds/xds_channel_stack_modifier.cc +9 -0
- data/src/core/ext/xds/xds_channel_stack_modifier.h +5 -1
- data/src/core/ext/xds/xds_client.cc +71 -22
- data/src/core/ext/xds/xds_client.h +17 -3
- data/src/core/ext/xds/xds_client_stats.cc +3 -4
- data/src/core/ext/xds/xds_client_stats.h +4 -3
- data/src/core/ext/xds/xds_cluster.cc +21 -10
- data/src/core/ext/xds/xds_cluster.h +9 -1
- data/src/core/ext/xds/xds_cluster_specifier_plugin.cc +16 -7
- data/src/core/ext/xds/xds_cluster_specifier_plugin.h +1 -8
- data/src/core/ext/xds/xds_common_types.cc +36 -22
- data/src/core/ext/xds/xds_common_types.h +12 -4
- data/src/core/ext/xds/xds_endpoint.cc +25 -15
- data/src/core/ext/xds/xds_endpoint.h +13 -5
- data/src/core/ext/xds/xds_http_fault_filter.cc +7 -5
- data/src/core/ext/xds/xds_http_fault_filter.h +3 -1
- data/src/core/ext/xds/xds_http_filters.cc +7 -0
- data/src/core/ext/xds/xds_http_filters.h +3 -3
- data/src/core/ext/xds/xds_http_rbac_filter.cc +16 -0
- data/src/core/ext/xds/xds_http_rbac_filter.h +7 -0
- data/src/core/ext/xds/xds_lb_policy_registry.cc +291 -0
- data/src/core/ext/xds/xds_lb_policy_registry.h +72 -0
- data/src/core/ext/xds/xds_listener.cc +51 -33
- data/src/core/ext/xds/xds_listener.h +10 -1
- data/src/core/ext/xds/xds_resource_type.h +3 -3
- data/src/core/ext/xds/xds_resource_type_impl.h +7 -3
- data/src/core/ext/xds/xds_route_config.cc +56 -28
- data/src/core/ext/xds/xds_route_config.h +11 -2
- data/src/core/ext/xds/xds_routing.cc +16 -0
- data/src/core/ext/xds/xds_routing.h +7 -2
- data/src/core/ext/xds/xds_server_config_fetcher.cc +54 -6
- data/src/core/lib/address_utils/parse_address.cc +5 -8
- data/src/core/lib/address_utils/parse_address.h +3 -2
- data/src/core/lib/address_utils/sockaddr_utils.cc +8 -7
- data/src/core/lib/address_utils/sockaddr_utils.h +2 -0
- data/src/core/lib/avl/avl.h +3 -3
- data/src/core/lib/backoff/backoff.cc +1 -1
- data/src/core/lib/backoff/backoff.h +1 -1
- data/src/core/lib/channel/call_tracer.h +3 -3
- data/src/core/lib/channel/channel_args.h +1 -0
- data/src/core/lib/channel/channel_args_preconditioning.cc +1 -0
- data/src/core/lib/channel/channel_fwd.h +26 -0
- data/src/core/lib/channel/channel_stack.cc +4 -4
- data/src/core/lib/channel/channel_stack.h +1 -11
- data/src/core/lib/channel/channel_stack_builder.h +2 -5
- data/src/core/lib/channel/channel_stack_builder_impl.cc +1 -1
- data/src/core/lib/channel/channel_stack_builder_impl.h +1 -0
- data/src/core/lib/channel/channelz.cc +2 -1
- data/src/core/lib/channel/channelz.h +2 -3
- data/src/core/lib/channel/channelz_registry.cc +4 -5
- data/src/core/lib/channel/connected_channel.cc +1 -0
- data/src/core/lib/channel/connected_channel.h +1 -0
- data/src/core/lib/channel/promise_based_filter.cc +11 -5
- data/src/core/lib/channel/promise_based_filter.h +2 -0
- data/src/core/lib/compression/compression.cc +6 -1
- data/src/core/lib/compression/compression_internal.cc +3 -6
- data/src/core/lib/compression/compression_internal.h +3 -2
- data/src/core/lib/compression/message_compress.cc +3 -1
- data/src/core/lib/compression/message_compress.h +2 -3
- data/src/core/lib/debug/stats.cc +9 -9
- data/src/core/lib/debug/stats.h +2 -1
- data/src/core/lib/debug/stats_data.cc +2 -1
- data/src/core/lib/debug/stats_data.h +0 -4
- data/src/core/lib/debug/trace.h +13 -12
- data/src/core/lib/event_engine/default_event_engine_factory.cc +1 -1
- data/src/core/lib/event_engine/event_engine.cc +24 -19
- data/src/core/lib/event_engine/event_engine_factory.h +2 -2
- data/src/core/lib/event_engine/{iomgr_engine.cc → iomgr_engine/iomgr_engine.cc} +44 -91
- data/src/core/lib/event_engine/{iomgr_engine.h → iomgr_engine/iomgr_engine.h} +20 -16
- data/src/core/lib/event_engine/iomgr_engine/thread_pool.cc +123 -0
- data/src/core/lib/event_engine/iomgr_engine/thread_pool.h +70 -0
- data/src/core/lib/event_engine/iomgr_engine/time_averaged_stats.cc +62 -0
- data/src/core/lib/event_engine/iomgr_engine/time_averaged_stats.h +81 -0
- data/src/core/lib/event_engine/iomgr_engine/timer.cc +312 -0
- data/src/core/lib/event_engine/iomgr_engine/timer.h +193 -0
- data/src/core/lib/event_engine/iomgr_engine/timer_heap.cc +107 -0
- data/src/core/lib/event_engine/iomgr_engine/timer_heap.h +56 -0
- data/src/core/lib/event_engine/iomgr_engine/timer_manager.cc +254 -0
- data/src/core/lib/event_engine/iomgr_engine/timer_manager.h +111 -0
- data/src/core/lib/event_engine/promise.h +69 -0
- data/src/core/lib/gpr/time_posix.cc +6 -9
- data/src/core/lib/gpr/time_windows.cc +10 -7
- data/src/core/lib/gprpp/manual_constructor.h +0 -67
- data/src/core/lib/gprpp/status_helper.cc +44 -30
- data/src/core/lib/gprpp/time.cc +8 -0
- data/src/core/lib/gprpp/time.h +4 -0
- data/src/core/lib/http/format_request.cc +5 -4
- data/src/core/lib/http/format_request.h +1 -1
- data/src/core/lib/http/httpcli.cc +18 -12
- data/src/core/lib/http/httpcli.h +19 -3
- data/src/core/lib/http/httpcli_security_connector.cc +16 -4
- data/src/core/lib/http/httpcli_ssl_credentials.h +3 -1
- data/src/core/lib/http/parser.cc +6 -7
- data/src/core/lib/http/parser.h +3 -0
- data/src/core/lib/iomgr/call_combiner.cc +2 -2
- data/src/core/lib/iomgr/endpoint.h +1 -1
- data/src/core/lib/iomgr/endpoint_cfstream.cc +2 -2
- data/src/core/lib/iomgr/error.cc +11 -9
- data/src/core/lib/iomgr/error.h +9 -5
- data/src/core/lib/iomgr/ev_epoll1_linux.cc +57 -18
- data/src/core/lib/iomgr/ev_epoll1_linux.h +1 -1
- data/src/core/lib/iomgr/ev_poll_posix.cc +77 -52
- data/src/core/lib/iomgr/ev_poll_posix.h +2 -2
- data/src/core/lib/iomgr/ev_posix.cc +54 -92
- data/src/core/lib/iomgr/ev_posix.h +5 -3
- data/src/core/lib/iomgr/fork_posix.cc +1 -1
- data/src/core/lib/iomgr/iomgr.cc +7 -0
- data/src/core/lib/iomgr/iomgr_posix.cc +1 -0
- data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +1 -0
- data/src/core/lib/iomgr/load_file.cc +1 -1
- data/src/core/lib/iomgr/resolve_address_posix.cc +1 -1
- data/src/core/lib/iomgr/resolve_address_windows.cc +1 -1
- data/src/core/lib/iomgr/tcp_client.cc +12 -7
- data/src/core/lib/iomgr/tcp_client.h +24 -13
- data/src/core/lib/iomgr/tcp_client_cfstream.cc +15 -9
- data/src/core/lib/iomgr/tcp_client_posix.cc +143 -25
- data/src/core/lib/iomgr/tcp_client_posix.h +1 -1
- data/src/core/lib/iomgr/tcp_client_windows.cc +14 -10
- data/src/core/lib/iomgr/tcp_posix.cc +91 -29
- data/src/core/lib/iomgr/tcp_server_posix.cc +7 -7
- data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +12 -12
- data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +2 -2
- data/src/core/lib/iomgr/tcp_server_windows.cc +7 -7
- data/src/core/lib/iomgr/tcp_windows.cc +5 -5
- data/src/core/lib/iomgr/unix_sockets_posix.cc +2 -2
- data/src/core/lib/iomgr/wakeup_fd_pipe.cc +2 -2
- data/src/core/lib/iomgr/wakeup_fd_posix.cc +15 -12
- data/src/core/lib/iomgr/wakeup_fd_posix.h +0 -2
- data/src/core/lib/iomgr/work_serializer.h +2 -3
- data/src/core/lib/matchers/matchers.cc +6 -3
- data/src/core/lib/matchers/matchers.h +2 -0
- data/src/core/lib/promise/activity.cc +0 -1
- data/src/core/lib/promise/activity.h +7 -13
- data/src/core/lib/promise/loop.h +1 -0
- data/src/core/lib/promise/promise.h +1 -0
- data/src/core/lib/promise/sleep.cc +36 -31
- data/src/core/lib/promise/sleep.h +25 -25
- data/src/core/lib/resolver/resolver.cc +5 -0
- data/src/core/lib/resolver/resolver.h +3 -0
- data/src/core/lib/resolver/resolver_factory.h +5 -2
- data/src/core/lib/resolver/resolver_registry.cc +2 -9
- data/src/core/lib/resolver/resolver_registry.h +12 -1
- data/src/core/lib/resolver/server_address.cc +8 -0
- data/src/core/lib/resolver/server_address.h +9 -2
- data/src/core/lib/resource_quota/memory_quota.cc +18 -60
- data/src/core/lib/resource_quota/memory_quota.h +11 -25
- data/src/core/lib/security/authorization/authorization_policy_provider.h +7 -0
- data/src/core/lib/security/authorization/authorization_policy_provider_vtable.cc +4 -0
- data/src/core/lib/security/authorization/evaluate_args.cc +9 -3
- data/src/core/lib/security/authorization/evaluate_args.h +6 -3
- data/src/core/lib/security/authorization/grpc_authorization_engine.cc +6 -0
- data/src/core/lib/security/authorization/grpc_authorization_engine.h +7 -0
- data/src/core/lib/security/authorization/grpc_server_authz_filter.cc +12 -0
- data/src/core/lib/security/authorization/grpc_server_authz_filter.h +12 -1
- data/src/core/lib/security/authorization/matchers.cc +9 -1
- data/src/core/lib/security/authorization/matchers.h +7 -0
- data/src/core/lib/security/authorization/rbac_policy.cc +5 -0
- data/src/core/lib/security/authorization/rbac_policy.h +7 -0
- data/src/core/lib/security/context/security_context.cc +5 -2
- data/src/core/lib/security/context/security_context.h +14 -2
- data/src/core/lib/security/credentials/alts/alts_credentials.cc +4 -2
- data/src/core/lib/security/credentials/alts/alts_credentials.h +6 -1
- data/src/core/lib/security/credentials/alts/grpc_alts_credentials_client_options.cc +1 -3
- data/src/core/lib/security/credentials/alts/grpc_alts_credentials_server_options.cc +1 -4
- data/src/core/lib/security/credentials/call_creds_util.cc +8 -0
- data/src/core/lib/security/credentials/call_creds_util.h +1 -0
- data/src/core/lib/security/credentials/channel_creds_registry.h +6 -1
- data/src/core/lib/security/credentials/channel_creds_registry_init.cc +10 -0
- data/src/core/lib/security/credentials/composite/composite_credentials.cc +4 -4
- data/src/core/lib/security/credentials/composite/composite_credentials.h +16 -2
- data/src/core/lib/security/credentials/credentials.cc +4 -8
- data/src/core/lib/security/credentials/credentials.h +10 -8
- data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +28 -10
- data/src/core/lib/security/credentials/external/aws_external_account_credentials.h +10 -0
- data/src/core/lib/security/credentials/external/aws_request_signer.cc +9 -0
- data/src/core/lib/security/credentials/external/external_account_credentials.cc +24 -9
- data/src/core/lib/security/credentials/external/external_account_credentials.h +11 -0
- data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +12 -4
- data/src/core/lib/security/credentials/external/file_external_account_credentials.h +6 -0
- data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +20 -4
- data/src/core/lib/security/credentials/external/url_external_account_credentials.h +10 -0
- data/src/core/lib/security/credentials/fake/fake_credentials.cc +8 -6
- data/src/core/lib/security/credentials/fake/fake_credentials.h +13 -1
- data/src/core/lib/security/credentials/google_default/credentials_generic.cc +1 -0
- data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +27 -10
- data/src/core/lib/security/credentials/google_default/google_default_credentials.h +10 -1
- data/src/core/lib/security/credentials/iam/iam_credentials.cc +9 -3
- data/src/core/lib/security/credentials/iam/iam_credentials.h +10 -0
- data/src/core/lib/security/credentials/insecure/insecure_credentials.cc +4 -0
- data/src/core/lib/security/credentials/insecure/insecure_credentials.h +5 -0
- data/src/core/lib/security/credentials/jwt/json_token.cc +5 -2
- data/src/core/lib/security/credentials/jwt/json_token.h +2 -2
- data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +11 -5
- data/src/core/lib/security/credentials/jwt/jwt_credentials.h +14 -0
- data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +28 -3
- data/src/core/lib/security/credentials/jwt/jwt_verifier.h +4 -2
- data/src/core/lib/security/credentials/local/local_credentials.cc +4 -3
- data/src/core/lib/security/credentials/local/local_credentials.h +7 -0
- data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +26 -13
- data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +20 -0
- data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +8 -7
- data/src/core/lib/security/credentials/plugin/plugin_credentials.h +24 -0
- data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +5 -0
- data/src/core/lib/security/credentials/ssl/ssl_credentials.h +13 -0
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.cc +6 -6
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.h +9 -3
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +29 -10
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h +9 -4
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.cc +9 -2
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.h +6 -7
- data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +4 -5
- data/src/core/lib/security/credentials/tls/tls_credentials.cc +7 -2
- data/src/core/lib/security/credentials/tls/tls_credentials.h +5 -1
- data/src/core/lib/security/credentials/tls/tls_utils.cc +2 -0
- data/src/core/lib/security/credentials/tls/tls_utils.h +1 -1
- data/src/core/lib/security/credentials/xds/xds_credentials.cc +8 -1
- data/src/core/lib/security/credentials/xds/xds_credentials.h +14 -0
- data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +22 -2
- data/src/core/lib/security/security_connector/alts/alts_security_connector.h +6 -3
- data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +17 -1
- data/src/core/lib/security/security_connector/fake/fake_security_connector.h +2 -2
- data/src/core/lib/security/security_connector/insecure/insecure_security_connector.cc +9 -0
- data/src/core/lib/security/security_connector/insecure/insecure_security_connector.h +17 -2
- data/src/core/lib/security/security_connector/load_system_roots_fallback.cc +5 -3
- data/src/core/lib/security/security_connector/{load_system_roots_linux.cc → load_system_roots_supported.cc} +27 -19
- data/src/core/lib/security/security_connector/{load_system_roots_linux.h → load_system_roots_supported.h} +5 -5
- data/src/core/lib/security/security_connector/local/local_security_connector.cc +22 -3
- data/src/core/lib/security/security_connector/local/local_security_connector.h +6 -2
- data/src/core/lib/security/security_connector/security_connector.cc +20 -18
- data/src/core/lib/security/security_connector/security_connector.h +18 -6
- data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +18 -6
- data/src/core/lib/security/security_connector/ssl/ssl_security_connector.h +4 -2
- data/src/core/lib/security/security_connector/ssl_utils.cc +12 -2
- data/src/core/lib/security/security_connector/ssl_utils.h +10 -7
- data/src/core/lib/security/security_connector/ssl_utils_config.h +1 -1
- data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +21 -13
- data/src/core/lib/security/security_connector/tls/tls_security_connector.h +23 -3
- data/src/core/lib/security/transport/auth_filters.h +7 -0
- data/src/core/lib/security/transport/client_auth_filter.cc +18 -9
- data/src/core/lib/security/transport/secure_endpoint.cc +63 -13
- data/src/core/lib/security/transport/secure_endpoint.h +4 -3
- data/src/core/lib/security/transport/security_handshaker.cc +44 -11
- data/src/core/lib/security/transport/security_handshaker.h +4 -0
- data/src/core/lib/security/transport/server_auth_filter.cc +26 -4
- data/src/core/lib/security/util/json_util.cc +3 -2
- data/src/core/lib/security/util/json_util.h +0 -2
- data/src/core/lib/service_config/service_config_call_data.h +2 -1
- data/src/core/lib/service_config/service_config_impl.cc +6 -6
- data/src/core/lib/service_config/service_config_impl.h +1 -3
- data/src/core/lib/service_config/service_config_parser.cc +2 -4
- data/src/core/lib/slice/slice_buffer.cc +30 -1
- data/src/core/lib/slice/slice_buffer.h +37 -6
- data/src/core/lib/slice/slice_string_helpers.cc +0 -20
- data/src/core/lib/slice/slice_string_helpers.h +0 -4
- data/src/core/lib/surface/call.cc +53 -115
- data/src/core/lib/surface/call.h +5 -1
- data/src/core/lib/surface/channel.h +2 -0
- data/src/core/lib/surface/channel_ping.cc +1 -1
- data/src/core/lib/surface/completion_queue.cc +15 -14
- data/src/core/lib/surface/completion_queue.h +2 -1
- data/src/core/lib/surface/init.cc +0 -1
- data/src/core/lib/surface/lame_client.cc +1 -1
- data/src/core/lib/surface/lame_client.h +1 -1
- data/src/core/lib/surface/server.cc +14 -8
- data/src/core/lib/surface/server.h +4 -1
- data/src/core/lib/surface/validate_metadata.cc +1 -1
- data/src/core/lib/surface/version.cc +2 -2
- data/src/core/lib/transport/error_utils.cc +13 -7
- data/src/core/lib/transport/handshaker.cc +3 -3
- data/src/core/lib/transport/http_connect_handshaker.cc +4 -4
- data/src/core/lib/transport/tcp_connect_handshaker.cc +2 -2
- data/src/core/lib/transport/transport.cc +0 -3
- data/src/core/lib/transport/transport.h +20 -14
- data/src/core/lib/transport/transport_fwd.h +20 -0
- data/src/core/lib/transport/transport_impl.h +1 -0
- data/src/core/lib/transport/transport_op_string.cc +9 -9
- data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +1 -1
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +9 -1
- data/src/core/tsi/fake_transport_security.cc +13 -1
- data/src/core/tsi/fake_transport_security.h +6 -0
- data/src/core/tsi/ssl_transport_security.cc +1 -1
- data/src/core/tsi/transport_security_grpc.cc +3 -2
- data/src/core/tsi/transport_security_grpc.h +5 -2
- data/src/ruby/ext/grpc/ext-export-truffleruby.clang +2 -0
- data/src/ruby/ext/grpc/ext-export-truffleruby.gcc +7 -0
- data/src/ruby/ext/grpc/ext-export.clang +1 -0
- data/src/ruby/ext/grpc/ext-export.gcc +1 -0
- data/src/ruby/ext/grpc/extconf.rb +49 -18
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +1 -1
- data/src/ruby/lib/grpc/errors.rb +1 -1
- data/src/ruby/lib/grpc/version.rb +1 -1
- data/src/ruby/spec/generic/client_stub_spec.rb +23 -23
- data/third_party/abseil-cpp/absl/algorithm/container.h +1 -1
- data/third_party/abseil-cpp/absl/base/attributes.h +49 -22
- data/third_party/abseil-cpp/absl/base/casts.h +61 -68
- data/third_party/abseil-cpp/absl/base/config.h +182 -41
- data/third_party/abseil-cpp/absl/base/internal/cycleclock.cc +12 -42
- data/third_party/abseil-cpp/absl/base/internal/cycleclock.h +67 -2
- data/third_party/abseil-cpp/absl/base/internal/direct_mmap.h +3 -3
- data/third_party/abseil-cpp/absl/base/internal/endian.h +17 -62
- data/third_party/abseil-cpp/absl/base/internal/fast_type_id.h +2 -0
- data/third_party/abseil-cpp/absl/base/internal/invoke.h +54 -0
- data/third_party/abseil-cpp/absl/base/internal/prefetch.h +138 -0
- data/third_party/abseil-cpp/absl/base/internal/raw_logging.cc +29 -22
- data/third_party/abseil-cpp/absl/base/internal/raw_logging.h +13 -12
- data/third_party/abseil-cpp/absl/base/internal/spinlock.cc +3 -0
- data/third_party/abseil-cpp/absl/base/internal/spinlock.h +8 -0
- data/third_party/abseil-cpp/absl/base/internal/spinlock_linux.inc +2 -5
- data/third_party/abseil-cpp/absl/base/internal/strerror.cc +88 -0
- data/third_party/abseil-cpp/absl/base/internal/strerror.h +39 -0
- data/third_party/abseil-cpp/absl/base/internal/sysinfo.cc +0 -1
- data/third_party/abseil-cpp/absl/base/internal/thread_identity.cc +2 -1
- data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.cc +6 -7
- data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.h +12 -3
- data/third_party/abseil-cpp/absl/base/log_severity.cc +28 -0
- data/third_party/abseil-cpp/absl/base/log_severity.h +51 -0
- data/third_party/abseil-cpp/absl/base/optimization.h +19 -11
- data/third_party/abseil-cpp/absl/base/options.h +1 -1
- data/third_party/abseil-cpp/absl/base/thread_annotations.h +2 -2
- data/third_party/abseil-cpp/absl/container/fixed_array.h +2 -0
- data/third_party/abseil-cpp/absl/container/flat_hash_map.h +11 -4
- data/third_party/abseil-cpp/absl/container/flat_hash_set.h +15 -9
- data/third_party/abseil-cpp/absl/container/inlined_vector.h +20 -9
- data/third_party/abseil-cpp/absl/container/internal/common.h +6 -5
- data/third_party/abseil-cpp/absl/container/internal/container_memory.h +10 -28
- data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +68 -20
- data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.h +29 -11
- data/third_party/abseil-cpp/absl/container/internal/inlined_vector.h +59 -38
- data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.cc +4 -0
- data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h +515 -184
- data/third_party/abseil-cpp/absl/debugging/internal/address_is_readable.cc +45 -88
- data/third_party/abseil-cpp/absl/debugging/internal/elf_mem_image.cc +4 -0
- data/third_party/abseil-cpp/absl/debugging/internal/elf_mem_image.h +3 -2
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_aarch64-inl.inc +8 -3
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_arm-inl.inc +8 -3
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_config.h +2 -1
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_powerpc-inl.inc +8 -3
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_riscv-inl.inc +20 -18
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_x86-inl.inc +8 -3
- data/third_party/abseil-cpp/absl/debugging/internal/vdso_support.cc +15 -2
- data/third_party/abseil-cpp/absl/debugging/symbolize.cc +6 -1
- data/third_party/abseil-cpp/absl/debugging/symbolize_elf.inc +46 -7
- data/third_party/abseil-cpp/absl/functional/bind_front.h +10 -1
- data/third_party/abseil-cpp/absl/functional/function_ref.h +2 -1
- data/third_party/abseil-cpp/absl/hash/hash.h +82 -8
- data/third_party/abseil-cpp/absl/hash/internal/hash.h +218 -23
- data/third_party/abseil-cpp/absl/numeric/bits.h +2 -1
- data/third_party/abseil-cpp/absl/numeric/int128.cc +4 -2
- data/third_party/abseil-cpp/absl/numeric/int128.h +2 -2
- data/third_party/abseil-cpp/absl/profiling/internal/sample_recorder.h +21 -6
- data/third_party/abseil-cpp/absl/random/bernoulli_distribution.h +4 -4
- data/third_party/abseil-cpp/absl/random/distributions.h +3 -3
- data/third_party/abseil-cpp/absl/random/internal/distribution_caller.h +3 -0
- data/third_party/abseil-cpp/absl/random/internal/fast_uniform_bits.h +2 -1
- data/third_party/abseil-cpp/absl/random/internal/generate_real.h +2 -2
- data/third_party/abseil-cpp/absl/random/internal/nonsecure_base.h +59 -48
- data/third_party/abseil-cpp/absl/random/internal/pcg_engine.h +1 -1
- data/third_party/abseil-cpp/absl/random/internal/randen.h +5 -11
- data/third_party/abseil-cpp/absl/random/internal/randen_detect.cc +6 -2
- data/third_party/abseil-cpp/absl/random/internal/randen_engine.h +48 -23
- data/third_party/abseil-cpp/absl/random/internal/salted_seed_seq.h +24 -26
- data/third_party/abseil-cpp/absl/random/internal/traits.h +53 -5
- data/third_party/abseil-cpp/absl/random/internal/uniform_helper.h +5 -5
- data/third_party/abseil-cpp/absl/random/internal/wide_multiply.h +33 -48
- data/third_party/abseil-cpp/absl/random/log_uniform_int_distribution.h +9 -10
- data/third_party/abseil-cpp/absl/random/poisson_distribution.h +7 -4
- data/third_party/abseil-cpp/absl/random/seed_sequences.h +1 -0
- data/third_party/abseil-cpp/absl/random/uniform_int_distribution.h +2 -2
- data/third_party/abseil-cpp/absl/random/uniform_real_distribution.h +1 -1
- data/third_party/abseil-cpp/absl/random/zipf_distribution.h +4 -3
- data/third_party/abseil-cpp/absl/status/internal/status_internal.h +17 -0
- data/third_party/abseil-cpp/absl/status/status.cc +174 -2
- data/third_party/abseil-cpp/absl/status/status.h +22 -12
- data/third_party/abseil-cpp/absl/status/statusor.h +9 -3
- data/third_party/abseil-cpp/absl/strings/ascii.h +4 -4
- data/third_party/abseil-cpp/absl/strings/cord.cc +194 -913
- data/third_party/abseil-cpp/absl/strings/cord.h +202 -81
- data/third_party/abseil-cpp/absl/strings/cord_analysis.cc +188 -0
- data/third_party/abseil-cpp/absl/strings/cord_analysis.h +44 -0
- data/third_party/abseil-cpp/absl/strings/cord_buffer.cc +30 -0
- data/third_party/abseil-cpp/absl/strings/cord_buffer.h +572 -0
- data/third_party/abseil-cpp/absl/strings/internal/cord_data_edge.h +63 -0
- data/third_party/abseil-cpp/absl/strings/internal/cord_internal.cc +20 -32
- data/third_party/abseil-cpp/absl/strings/internal/cord_internal.h +123 -88
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree.cc +149 -49
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree.h +44 -59
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_navigator.cc +3 -1
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_navigator.h +4 -2
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_reader.cc +3 -2
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_reader.h +5 -4
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_consume.cc +7 -74
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_crc.cc +54 -0
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_crc.h +102 -0
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_flat.h +58 -17
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring.cc +13 -11
- data/third_party/abseil-cpp/absl/strings/internal/cordz_info.cc +11 -38
- data/third_party/abseil-cpp/absl/strings/internal/cordz_statistics.h +1 -0
- data/third_party/abseil-cpp/absl/strings/internal/cordz_update_tracker.h +4 -2
- data/third_party/abseil-cpp/absl/strings/internal/escaping.cc +6 -5
- data/third_party/abseil-cpp/absl/strings/internal/ostringstream.cc +1 -1
- data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.cc +1 -1
- data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.h +1 -1
- data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.h +38 -7
- data/third_party/abseil-cpp/absl/strings/internal/str_format/checker.h +7 -2
- data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.cc +4 -5
- data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.h +5 -2
- data/third_party/abseil-cpp/absl/strings/internal/str_format/output.h +2 -1
- data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.h +4 -2
- data/third_party/abseil-cpp/absl/strings/internal/str_join_internal.h +9 -6
- data/third_party/abseil-cpp/absl/strings/internal/string_constant.h +10 -2
- data/third_party/abseil-cpp/absl/strings/internal/utf8.cc +9 -9
- data/third_party/abseil-cpp/absl/strings/numbers.cc +8 -8
- data/third_party/abseil-cpp/absl/strings/numbers.h +26 -23
- data/third_party/abseil-cpp/absl/strings/str_cat.h +20 -13
- data/third_party/abseil-cpp/absl/strings/str_join.h +9 -15
- data/third_party/abseil-cpp/absl/strings/str_split.h +1 -2
- data/third_party/abseil-cpp/absl/strings/string_view.cc +2 -13
- data/third_party/abseil-cpp/absl/strings/string_view.h +3 -2
- data/third_party/abseil-cpp/absl/strings/strip.h +8 -6
- data/third_party/abseil-cpp/absl/strings/substitute.h +10 -2
- data/third_party/abseil-cpp/absl/synchronization/internal/create_thread_identity.cc +9 -6
- data/third_party/abseil-cpp/absl/synchronization/internal/create_thread_identity.h +0 -4
- data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.cc +0 -4
- data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.h +1 -6
- data/third_party/abseil-cpp/absl/synchronization/internal/waiter.cc +0 -25
- data/third_party/abseil-cpp/absl/synchronization/internal/waiter.h +10 -4
- data/third_party/abseil-cpp/absl/synchronization/mutex.cc +75 -40
- data/third_party/abseil-cpp/absl/synchronization/mutex.h +17 -9
- data/third_party/abseil-cpp/absl/synchronization/notification.h +3 -2
- data/third_party/abseil-cpp/absl/time/duration.cc +5 -4
- data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/civil_time_detail.h +11 -7
- data/third_party/abseil-cpp/absl/time/time.h +16 -12
- data/third_party/abseil-cpp/absl/types/internal/optional.h +8 -0
- data/third_party/abseil-cpp/absl/types/internal/variant.h +3 -3
- data/third_party/abseil-cpp/absl/types/optional.h +17 -14
- data/third_party/abseil-cpp/absl/types/span.h +2 -1
- metadata +39 -15
- data/src/core/lib/slice/slice_split.cc +0 -103
- data/src/core/lib/slice/slice_split.h +0 -36
- data/src/core/lib/transport/byte_stream.cc +0 -165
- data/src/core/lib/transport/byte_stream.h +0 -170
- data/third_party/abseil-cpp/absl/cleanup/cleanup.h +0 -140
- data/third_party/abseil-cpp/absl/cleanup/internal/cleanup.h +0 -100
- data/third_party/abseil-cpp/absl/container/internal/have_sse.h +0 -50
@@ -0,0 +1,254 @@
|
|
1
|
+
/*
|
2
|
+
*
|
3
|
+
* Copyright 2017 gRPC authors.
|
4
|
+
*
|
5
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
6
|
+
* you may not use this file except in compliance with the License.
|
7
|
+
* You may obtain a copy of the License at
|
8
|
+
*
|
9
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
10
|
+
*
|
11
|
+
* Unless required by applicable law or agreed to in writing, software
|
12
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
13
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14
|
+
* See the License for the specific language governing permissions and
|
15
|
+
* limitations under the License.
|
16
|
+
*
|
17
|
+
*/
|
18
|
+
|
19
|
+
#include <grpc/support/port_platform.h>
|
20
|
+
|
21
|
+
#include "src/core/lib/event_engine/iomgr_engine/timer_manager.h"
|
22
|
+
|
23
|
+
#include <algorithm>
|
24
|
+
#include <memory>
|
25
|
+
#include <utility>
|
26
|
+
|
27
|
+
#include "absl/memory/memory.h"
|
28
|
+
#include "absl/time/time.h"
|
29
|
+
#include "absl/types/optional.h"
|
30
|
+
|
31
|
+
#include <grpc/impl/codegen/gpr_types.h>
|
32
|
+
#include <grpc/support/log.h>
|
33
|
+
#include <grpc/support/time.h>
|
34
|
+
|
35
|
+
#include "src/core/lib/gprpp/thd.h"
|
36
|
+
|
37
|
+
namespace grpc_event_engine {
|
38
|
+
namespace iomgr_engine {
|
39
|
+
|
40
|
+
namespace {
|
41
|
+
class ThreadCollector {
|
42
|
+
public:
|
43
|
+
ThreadCollector() = default;
|
44
|
+
~ThreadCollector();
|
45
|
+
|
46
|
+
void Collect(std::vector<grpc_core::Thread> threads) {
|
47
|
+
GPR_ASSERT(threads_.empty());
|
48
|
+
threads_ = std::move(threads);
|
49
|
+
}
|
50
|
+
|
51
|
+
private:
|
52
|
+
std::vector<grpc_core::Thread> threads_;
|
53
|
+
};
|
54
|
+
|
55
|
+
ThreadCollector::~ThreadCollector() {
|
56
|
+
for (auto& t : threads_) t.Join();
|
57
|
+
}
|
58
|
+
} // namespace
|
59
|
+
|
60
|
+
void TimerManager::StartThread() {
|
61
|
+
++waiter_count_;
|
62
|
+
++thread_count_;
|
63
|
+
auto* thread = new RunThreadArgs();
|
64
|
+
thread->self = this;
|
65
|
+
thread->thread =
|
66
|
+
grpc_core::Thread("timer_manager", &TimerManager::RunThread, thread);
|
67
|
+
thread->thread.Start();
|
68
|
+
}
|
69
|
+
|
70
|
+
void TimerManager::RunSomeTimers(
|
71
|
+
std::vector<experimental::EventEngine::Closure*> timers) {
|
72
|
+
// if there's something to execute...
|
73
|
+
ThreadCollector collector;
|
74
|
+
{
|
75
|
+
grpc_core::MutexLock lock(&mu_);
|
76
|
+
// remove a waiter from the pool, and start another thread if necessary
|
77
|
+
--waiter_count_;
|
78
|
+
if (waiter_count_ == 0) {
|
79
|
+
// The number of timer threads is always increasing until all the threads
|
80
|
+
// are stopped. In rare cases, if a large number of timers fire
|
81
|
+
// simultaneously, we may end up using a large number of threads.
|
82
|
+
// TODO(ctiller): We could avoid this by exiting threads in WaitUntil().
|
83
|
+
StartThread();
|
84
|
+
} else {
|
85
|
+
// if there's no thread waiting with a timeout, kick an existing untimed
|
86
|
+
// waiter so that the next deadline is not missed
|
87
|
+
if (!has_timed_waiter_) {
|
88
|
+
cv_.Signal();
|
89
|
+
}
|
90
|
+
}
|
91
|
+
}
|
92
|
+
for (auto* timer : timers) {
|
93
|
+
timer->Run();
|
94
|
+
}
|
95
|
+
{
|
96
|
+
grpc_core::MutexLock lock(&mu_);
|
97
|
+
collector.Collect(std::move(completed_threads_));
|
98
|
+
// get ready to wait again
|
99
|
+
++waiter_count_;
|
100
|
+
}
|
101
|
+
}
|
102
|
+
|
103
|
+
// wait until 'next' (or forever if there is already a timed waiter in the pool)
|
104
|
+
// returns true if the thread should continue executing (false if it should
|
105
|
+
// shutdown)
|
106
|
+
bool TimerManager::WaitUntil(grpc_core::Timestamp next) {
|
107
|
+
grpc_core::MutexLock lock(&mu_);
|
108
|
+
|
109
|
+
if (shutdown_) {
|
110
|
+
return false;
|
111
|
+
}
|
112
|
+
|
113
|
+
// TODO(ctiller): if there are too many waiting threads, this would be a good
|
114
|
+
// place to exit the current thread.
|
115
|
+
|
116
|
+
// If kicked_ is true at this point, it means there was a kick from the timer
|
117
|
+
// system that the timer-manager threads here missed. We cannot trust 'next'
|
118
|
+
// here any longer (since there might be an earlier deadline). So if kicked_
|
119
|
+
// is true at this point, we should quickly exit this and get the next
|
120
|
+
// deadline from the timer system
|
121
|
+
|
122
|
+
if (!kicked_) {
|
123
|
+
// if there's no timed waiter, we should become one: that waiter waits
|
124
|
+
// only until the next timer should expire. All other timers wait forever
|
125
|
+
//
|
126
|
+
// 'timed_waiter_generation_' is a global generation counter. The idea here
|
127
|
+
// is that the thread becoming a timed-waiter increments and stores this
|
128
|
+
// global counter locally in 'my_timed_waiter_generation' before going to
|
129
|
+
// sleep. After waking up, if my_timed_waiter_generation ==
|
130
|
+
// timed_waiter_generation_, it can be sure that it was the timed_waiter
|
131
|
+
// thread (and that no other thread took over while this was asleep)
|
132
|
+
//
|
133
|
+
// Initialize my_timed_waiter_generation to some value that is NOT equal to
|
134
|
+
// timed_waiter_generation_
|
135
|
+
uint64_t my_timed_waiter_generation = timed_waiter_generation_ - 1;
|
136
|
+
|
137
|
+
/* If there's no timed waiter, we should become one: that waiter waits only
|
138
|
+
until the next timer should expire. All other timer threads wait forever
|
139
|
+
unless their 'next' is earlier than the current timed-waiter's deadline
|
140
|
+
(in which case the thread with earlier 'next' takes over as the new timed
|
141
|
+
waiter) */
|
142
|
+
if (next != grpc_core::Timestamp::InfFuture()) {
|
143
|
+
if (!has_timed_waiter_ || (next < timed_waiter_deadline_)) {
|
144
|
+
my_timed_waiter_generation = ++timed_waiter_generation_;
|
145
|
+
has_timed_waiter_ = true;
|
146
|
+
timed_waiter_deadline_ = next;
|
147
|
+
} else { // timed_waiter_ == true && next >= timed_waiter_deadline_
|
148
|
+
next = grpc_core::Timestamp::InfFuture();
|
149
|
+
}
|
150
|
+
}
|
151
|
+
|
152
|
+
cv_.WaitWithTimeout(&mu_,
|
153
|
+
absl::Milliseconds((next - host_.Now()).millis()));
|
154
|
+
|
155
|
+
// if this was the timed waiter, then we need to check timers, and flag
|
156
|
+
// that there's now no timed waiter... we'll look for a replacement if
|
157
|
+
// there's work to do after checking timers (code above)
|
158
|
+
if (my_timed_waiter_generation == timed_waiter_generation_) {
|
159
|
+
++wakeups_;
|
160
|
+
has_timed_waiter_ = false;
|
161
|
+
timed_waiter_deadline_ = grpc_core::Timestamp::InfFuture();
|
162
|
+
}
|
163
|
+
}
|
164
|
+
|
165
|
+
kicked_ = false;
|
166
|
+
|
167
|
+
return true;
|
168
|
+
}
|
169
|
+
|
170
|
+
void TimerManager::MainLoop() {
|
171
|
+
for (;;) {
|
172
|
+
grpc_core::Timestamp next = grpc_core::Timestamp::InfFuture();
|
173
|
+
absl::optional<std::vector<experimental::EventEngine::Closure*>>
|
174
|
+
check_result = timer_list_->TimerCheck(&next);
|
175
|
+
if (check_result.has_value()) {
|
176
|
+
if (!check_result->empty()) {
|
177
|
+
RunSomeTimers(std::move(*check_result));
|
178
|
+
continue;
|
179
|
+
}
|
180
|
+
} else {
|
181
|
+
/* This case only happens under contention, meaning more than one timer
|
182
|
+
manager thread checked timers concurrently.
|
183
|
+
|
184
|
+
If that happens, we're guaranteed that some other thread has just
|
185
|
+
checked timers, and this will avalanche into some other thread seeing
|
186
|
+
empty timers and doing a timed sleep.
|
187
|
+
|
188
|
+
Consequently, we can just sleep forever here and be happy at some
|
189
|
+
saved wakeup cycles. */
|
190
|
+
next = grpc_core::Timestamp::InfFuture();
|
191
|
+
}
|
192
|
+
if (!WaitUntil(next)) return;
|
193
|
+
}
|
194
|
+
}
|
195
|
+
|
196
|
+
void TimerManager::RunThread(void* arg) {
|
197
|
+
std::unique_ptr<RunThreadArgs> thread(static_cast<RunThreadArgs*>(arg));
|
198
|
+
thread->self->MainLoop();
|
199
|
+
{
|
200
|
+
grpc_core::MutexLock lock(&thread->self->mu_);
|
201
|
+
thread->self->thread_count_--;
|
202
|
+
thread->self->completed_threads_.push_back(std::move(thread->thread));
|
203
|
+
}
|
204
|
+
thread->self->cv_.Signal();
|
205
|
+
}
|
206
|
+
|
207
|
+
TimerManager::TimerManager() : host_(this) {
|
208
|
+
timer_list_ = absl::make_unique<TimerList>(&host_);
|
209
|
+
grpc_core::MutexLock lock(&mu_);
|
210
|
+
StartThread();
|
211
|
+
}
|
212
|
+
|
213
|
+
grpc_core::Timestamp TimerManager::Host::Now() {
|
214
|
+
return grpc_core::Timestamp::FromTimespecRoundDown(
|
215
|
+
gpr_now(GPR_CLOCK_MONOTONIC));
|
216
|
+
}
|
217
|
+
|
218
|
+
void TimerManager::TimerInit(Timer* timer, grpc_core::Timestamp deadline,
|
219
|
+
experimental::EventEngine::Closure* closure) {
|
220
|
+
timer_list_->TimerInit(timer, deadline, closure);
|
221
|
+
}
|
222
|
+
|
223
|
+
bool TimerManager::TimerCancel(Timer* timer) {
|
224
|
+
return timer_list_->TimerCancel(timer);
|
225
|
+
}
|
226
|
+
|
227
|
+
TimerManager::~TimerManager() {
|
228
|
+
{
|
229
|
+
grpc_core::MutexLock lock(&mu_);
|
230
|
+
shutdown_ = true;
|
231
|
+
cv_.SignalAll();
|
232
|
+
}
|
233
|
+
while (true) {
|
234
|
+
ThreadCollector collector;
|
235
|
+
grpc_core::MutexLock lock(&mu_);
|
236
|
+
collector.Collect(std::move(completed_threads_));
|
237
|
+
if (thread_count_ == 0) break;
|
238
|
+
cv_.Wait(&mu_);
|
239
|
+
}
|
240
|
+
}
|
241
|
+
|
242
|
+
void TimerManager::Host::Kick() { timer_manager_->Kick(); }
|
243
|
+
|
244
|
+
void TimerManager::Kick() {
|
245
|
+
grpc_core::MutexLock lock(&mu_);
|
246
|
+
has_timed_waiter_ = false;
|
247
|
+
timed_waiter_deadline_ = grpc_core::Timestamp::InfFuture();
|
248
|
+
++timed_waiter_generation_;
|
249
|
+
kicked_ = true;
|
250
|
+
cv_.Signal();
|
251
|
+
}
|
252
|
+
|
253
|
+
} // namespace iomgr_engine
|
254
|
+
} // namespace grpc_event_engine
|
@@ -0,0 +1,111 @@
|
|
1
|
+
/*
|
2
|
+
*
|
3
|
+
* Copyright 2017 gRPC authors.
|
4
|
+
*
|
5
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
6
|
+
* you may not use this file except in compliance with the License.
|
7
|
+
* You may obtain a copy of the License at
|
8
|
+
*
|
9
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
10
|
+
*
|
11
|
+
* Unless required by applicable law or agreed to in writing, software
|
12
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
13
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14
|
+
* See the License for the specific language governing permissions and
|
15
|
+
* limitations under the License.
|
16
|
+
*
|
17
|
+
*/
|
18
|
+
|
19
|
+
#ifndef GRPC_CORE_LIB_EVENT_ENGINE_IOMGR_ENGINE_TIMER_MANAGER_H
|
20
|
+
#define GRPC_CORE_LIB_EVENT_ENGINE_IOMGR_ENGINE_TIMER_MANAGER_H
|
21
|
+
|
22
|
+
#include <grpc/support/port_platform.h>
|
23
|
+
|
24
|
+
#include <stddef.h>
|
25
|
+
#include <stdint.h>
|
26
|
+
|
27
|
+
#include <memory>
|
28
|
+
#include <vector>
|
29
|
+
|
30
|
+
#include "absl/base/thread_annotations.h"
|
31
|
+
|
32
|
+
#include <grpc/event_engine/event_engine.h>
|
33
|
+
|
34
|
+
#include "src/core/lib/event_engine/iomgr_engine/timer.h"
|
35
|
+
#include "src/core/lib/gprpp/sync.h"
|
36
|
+
#include "src/core/lib/gprpp/thd.h"
|
37
|
+
#include "src/core/lib/gprpp/time.h"
|
38
|
+
|
39
|
+
namespace grpc_event_engine {
|
40
|
+
namespace iomgr_engine {
|
41
|
+
|
42
|
+
// Timer Manager tries to keep only one thread waiting for the next timeout at
|
43
|
+
// all times, and thus effectively preventing the thundering herd problem.
|
44
|
+
// TODO(ctiller): consider unifying this thread pool and the one in
|
45
|
+
// thread_pool.{h,cc}.
|
46
|
+
class TimerManager final {
|
47
|
+
public:
|
48
|
+
TimerManager();
|
49
|
+
~TimerManager();
|
50
|
+
|
51
|
+
grpc_core::Timestamp Now() { return host_.Now(); }
|
52
|
+
|
53
|
+
void TimerInit(Timer* timer, grpc_core::Timestamp deadline,
|
54
|
+
experimental::EventEngine::Closure* closure);
|
55
|
+
bool TimerCancel(Timer* timer);
|
56
|
+
|
57
|
+
private:
|
58
|
+
struct RunThreadArgs {
|
59
|
+
TimerManager* self;
|
60
|
+
grpc_core::Thread thread;
|
61
|
+
};
|
62
|
+
|
63
|
+
class Host final : public TimerListHost {
|
64
|
+
public:
|
65
|
+
explicit Host(TimerManager* timer_manager)
|
66
|
+
: timer_manager_(timer_manager) {}
|
67
|
+
|
68
|
+
void Kick() override;
|
69
|
+
grpc_core::Timestamp Now() override;
|
70
|
+
|
71
|
+
private:
|
72
|
+
TimerManager* const timer_manager_;
|
73
|
+
};
|
74
|
+
|
75
|
+
void StartThread() ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_);
|
76
|
+
static void RunThread(void* arg);
|
77
|
+
void MainLoop();
|
78
|
+
void RunSomeTimers(std::vector<experimental::EventEngine::Closure*> timers);
|
79
|
+
bool WaitUntil(grpc_core::Timestamp next);
|
80
|
+
void Kick();
|
81
|
+
|
82
|
+
grpc_core::Mutex mu_;
|
83
|
+
grpc_core::CondVar cv_;
|
84
|
+
Host host_;
|
85
|
+
// number of threads in the system
|
86
|
+
size_t thread_count_ ABSL_GUARDED_BY(mu_) = 0;
|
87
|
+
// number of threads sitting around waiting
|
88
|
+
size_t waiter_count_ ABSL_GUARDED_BY(mu_) = 0;
|
89
|
+
// Threads waiting to be joined
|
90
|
+
std::vector<grpc_core::Thread> completed_threads_ ABSL_GUARDED_BY(mu_);
|
91
|
+
// is there a thread waiting until the next timer should fire?
|
92
|
+
bool has_timed_waiter_ ABSL_GUARDED_BY(mu_) = false;
|
93
|
+
// are we shutting down?
|
94
|
+
bool shutdown_ ABSL_GUARDED_BY(mu_) = false;
|
95
|
+
// are we shutting down?
|
96
|
+
bool kicked_ ABSL_GUARDED_BY(mu_) = false;
|
97
|
+
// the deadline of the current timed waiter thread (only relevant if
|
98
|
+
// has_timed_waiter_ is true)
|
99
|
+
grpc_core::Timestamp timed_waiter_deadline_ ABSL_GUARDED_BY(mu_);
|
100
|
+
// generation counter to track which thread is waiting for the next timer
|
101
|
+
uint64_t timed_waiter_generation_ ABSL_GUARDED_BY(mu_) = 0;
|
102
|
+
// number of timer wakeups
|
103
|
+
uint64_t wakeups_ ABSL_GUARDED_BY(mu_) = 0;
|
104
|
+
// actual timer implementation
|
105
|
+
std::unique_ptr<TimerList> timer_list_;
|
106
|
+
};
|
107
|
+
|
108
|
+
} // namespace iomgr_engine
|
109
|
+
} // namespace grpc_event_engine
|
110
|
+
|
111
|
+
#endif /* GRPC_CORE_LIB_EVENT_ENGINE_IOMGR_ENGINE_TIMER_MANAGER_H */
|
@@ -0,0 +1,69 @@
|
|
1
|
+
// Copyright 2021 The gRPC Authors
|
2
|
+
//
|
3
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
// you may not use this file except in compliance with the License.
|
5
|
+
// You may obtain a copy of the License at
|
6
|
+
//
|
7
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
//
|
9
|
+
// Unless required by applicable law or agreed to in writing, software
|
10
|
+
// distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
// See the License for the specific language governing permissions and
|
13
|
+
// limitations under the License.
|
14
|
+
#ifndef GRPC_CORE_LIB_EVENT_ENGINE_PROMISE_H
|
15
|
+
#define GRPC_CORE_LIB_EVENT_ENGINE_PROMISE_H
|
16
|
+
#include <grpc/support/port_platform.h>
|
17
|
+
|
18
|
+
#include <grpc/support/log.h>
|
19
|
+
|
20
|
+
#include "src/core/lib/gprpp/sync.h"
|
21
|
+
|
22
|
+
namespace grpc_event_engine {
|
23
|
+
namespace experimental {
|
24
|
+
|
25
|
+
/// A minimal promise implementation.
|
26
|
+
///
|
27
|
+
/// This is light-duty, syntactical sugar around cv wait & signal, which is
|
28
|
+
/// useful in some cases. A more robust implementation is being worked on
|
29
|
+
/// separately.
|
30
|
+
template <typename T>
|
31
|
+
class Promise {
|
32
|
+
public:
|
33
|
+
// The getter will wait until the setter has been called, and will return the
|
34
|
+
// value passed during Set.
|
35
|
+
T& Get() {
|
36
|
+
grpc_core::MutexLock lock(&mu_);
|
37
|
+
if (!set_) {
|
38
|
+
cv_.Wait(&mu_);
|
39
|
+
}
|
40
|
+
return val_;
|
41
|
+
}
|
42
|
+
// This setter can only be called exactly once without a Reset.
|
43
|
+
// Will automatically unblock getters.
|
44
|
+
void Set(T&& val) {
|
45
|
+
grpc_core::MutexLock lock(&mu_);
|
46
|
+
GPR_ASSERT(!set_);
|
47
|
+
val_ = std::move(val);
|
48
|
+
set_ = true;
|
49
|
+
cv_.SignalAll();
|
50
|
+
}
|
51
|
+
|
52
|
+
// Can only be called after a set operation.
|
53
|
+
void Reset() {
|
54
|
+
grpc_core::MutexLock lock(&mu_);
|
55
|
+
GPR_ASSERT(set_);
|
56
|
+
set_ = false;
|
57
|
+
}
|
58
|
+
|
59
|
+
private:
|
60
|
+
grpc_core::Mutex mu_;
|
61
|
+
grpc_core::CondVar cv_;
|
62
|
+
T val_;
|
63
|
+
bool set_ = false;
|
64
|
+
};
|
65
|
+
|
66
|
+
} // namespace experimental
|
67
|
+
} // namespace grpc_event_engine
|
68
|
+
|
69
|
+
#endif // GRPC_CORE_LIB_EVENT_ENGINE_PROMISE_H
|
@@ -88,17 +88,14 @@ static gpr_timespec now_impl(gpr_clock_type clock_type) {
|
|
88
88
|
#include <mach/mach_time.h>
|
89
89
|
#include <sys/time.h>
|
90
90
|
|
91
|
-
static double g_time_scale
|
92
|
-
static uint64_t g_time_start;
|
93
|
-
|
94
|
-
void gpr_time_init(void) {
|
91
|
+
static double g_time_scale = []() {
|
95
92
|
mach_timebase_info_data_t tb = {0, 1};
|
96
|
-
gpr_precise_clock_init();
|
97
93
|
mach_timebase_info(&tb);
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
94
|
+
return static_cast<double>(tb.numer) / static_cast<double>(tb.denom);
|
95
|
+
}();
|
96
|
+
static uint64_t g_time_start = mach_absolute_time();
|
97
|
+
|
98
|
+
void gpr_time_init(void) { gpr_precise_clock_init(); }
|
102
99
|
|
103
100
|
static gpr_timespec now_impl(gpr_clock_type clock) {
|
104
101
|
gpr_timespec now;
|
@@ -31,15 +31,18 @@
|
|
31
31
|
|
32
32
|
#include "src/core/lib/gpr/time_precise.h"
|
33
33
|
|
34
|
-
static LARGE_INTEGER g_start_time
|
35
|
-
|
36
|
-
|
37
|
-
|
34
|
+
static LARGE_INTEGER g_start_time = []() {
|
35
|
+
LARGE_INTEGER x;
|
36
|
+
QueryPerformanceCounter(&x);
|
37
|
+
return x;
|
38
|
+
}();
|
39
|
+
static double g_time_scale = []() {
|
38
40
|
LARGE_INTEGER frequency;
|
39
41
|
QueryPerformanceFrequency(&frequency);
|
40
|
-
|
41
|
-
|
42
|
-
|
42
|
+
return 1.0 / (double)frequency.QuadPart;
|
43
|
+
}();
|
44
|
+
|
45
|
+
void gpr_time_init(void) {}
|
43
46
|
|
44
47
|
static gpr_timespec now_impl(gpr_clock_type clock) {
|
45
48
|
gpr_timespec now_tv;
|
@@ -25,12 +25,9 @@
|
|
25
25
|
|
26
26
|
#include <stddef.h>
|
27
27
|
|
28
|
-
#include <new>
|
29
28
|
#include <type_traits>
|
30
29
|
#include <utility>
|
31
30
|
|
32
|
-
#include <grpc/support/log.h>
|
33
|
-
|
34
31
|
#include "src/core/lib/gprpp/construct_destruct.h"
|
35
32
|
|
36
33
|
namespace grpc_core {
|
@@ -102,70 +99,6 @@ class max_align_of<A, B...> {
|
|
102
99
|
|
103
100
|
} // namespace manual_ctor_impl
|
104
101
|
|
105
|
-
template <class BaseType, class... DerivedTypes>
|
106
|
-
class PolymorphicManualConstructor {
|
107
|
-
public:
|
108
|
-
// No constructor or destructor because one of the most useful uses of
|
109
|
-
// this class is as part of a union, and members of a union could not have
|
110
|
-
// constructors or destructors till C++11. And, anyway, the whole point of
|
111
|
-
// this class is to bypass constructor and destructor.
|
112
|
-
|
113
|
-
BaseType* get() { return reinterpret_cast<BaseType*>(&space_); }
|
114
|
-
const BaseType* get() const {
|
115
|
-
return reinterpret_cast<const BaseType*>(&space_);
|
116
|
-
}
|
117
|
-
|
118
|
-
BaseType* operator->() { return get(); }
|
119
|
-
const BaseType* operator->() const { return get(); }
|
120
|
-
|
121
|
-
BaseType& operator*() { return *get(); }
|
122
|
-
const BaseType& operator*() const { return *get(); }
|
123
|
-
|
124
|
-
template <class DerivedType>
|
125
|
-
void Init() {
|
126
|
-
FinishInit(new (&space_) DerivedType);
|
127
|
-
}
|
128
|
-
|
129
|
-
// Init() constructs the Type instance using the given arguments
|
130
|
-
// (which are forwarded to Type's constructor).
|
131
|
-
//
|
132
|
-
// Note that Init() with no arguments performs default-initialization,
|
133
|
-
// not zero-initialization (i.e it behaves the same as "new Type;", not
|
134
|
-
// "new Type();"), so it will leave non-class types uninitialized.
|
135
|
-
template <class DerivedType, typename... Ts>
|
136
|
-
void Init(Ts&&... args) {
|
137
|
-
FinishInit(new (&space_) DerivedType(std::forward<Ts>(args)...));
|
138
|
-
}
|
139
|
-
|
140
|
-
// Init() that is equivalent to copy and move construction.
|
141
|
-
// Enables usage like this:
|
142
|
-
// ManualConstructor<std::vector<int>> v;
|
143
|
-
// v.Init({1, 2, 3});
|
144
|
-
template <class DerivedType>
|
145
|
-
void Init(const DerivedType& x) {
|
146
|
-
FinishInit(new (&space_) DerivedType(x));
|
147
|
-
}
|
148
|
-
template <class DerivedType>
|
149
|
-
void Init(DerivedType&& x) {
|
150
|
-
FinishInit(new (&space_) DerivedType(std::forward<DerivedType>(x)));
|
151
|
-
}
|
152
|
-
|
153
|
-
void Destroy() { get()->~BaseType(); }
|
154
|
-
|
155
|
-
private:
|
156
|
-
template <class DerivedType>
|
157
|
-
void FinishInit(DerivedType* p) {
|
158
|
-
static_assert(
|
159
|
-
manual_ctor_impl::is_one_of<DerivedType, DerivedTypes...>::value,
|
160
|
-
"DerivedType must be one of the predeclared DerivedTypes");
|
161
|
-
GPR_ASSERT(static_cast<BaseType*>(p) == p);
|
162
|
-
}
|
163
|
-
|
164
|
-
typename std::aligned_storage<
|
165
|
-
manual_ctor_impl::max_size_of<DerivedTypes...>::value,
|
166
|
-
manual_ctor_impl::max_align_of<DerivedTypes...>::value>::type space_;
|
167
|
-
};
|
168
|
-
|
169
102
|
template <typename Type>
|
170
103
|
class ManualConstructor {
|
171
104
|
public:
|