diff --git a/CMakeLists.txt b/CMakeLists.txt index 9782163ed81..b9390ecccf2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2242,7 +2242,6 @@ add_library(grpc src/core/lib/event_engine/default_event_engine_factory.cc src/core/lib/event_engine/event_engine.cc src/core/lib/event_engine/forkable.cc - src/core/lib/event_engine/memory_allocator.cc src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc src/core/lib/event_engine/posix_engine/ev_poll_posix.cc src/core/lib/event_engine/posix_engine/event_poller_posix_default.cc @@ -2971,7 +2970,6 @@ add_library(grpc_unsecure src/core/lib/event_engine/default_event_engine_factory.cc src/core/lib/event_engine/event_engine.cc src/core/lib/event_engine/forkable.cc - src/core/lib/event_engine/memory_allocator.cc src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc src/core/lib/event_engine/posix_engine/ev_poll_posix.cc src/core/lib/event_engine/posix_engine/event_poller_posix_default.cc @@ -4960,7 +4958,6 @@ add_library(grpc_authorization_provider src/core/lib/event_engine/default_event_engine_factory.cc src/core/lib/event_engine/event_engine.cc src/core/lib/event_engine/forkable.cc - src/core/lib/event_engine/memory_allocator.cc src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc src/core/lib/event_engine/posix_engine/ev_poll_posix.cc src/core/lib/event_engine/posix_engine/event_poller_posix_default.cc @@ -8863,7 +8860,6 @@ add_executable(chunked_vector_test src/core/ext/upb-gen/google/protobuf/descriptor.upb_minitable.c src/core/ext/upb-gen/google/rpc/status.upb_minitable.c src/core/lib/debug/trace.cc - src/core/lib/event_engine/memory_allocator.cc src/core/lib/experiments/config.cc src/core/lib/experiments/experiments.cc src/core/lib/gprpp/status_helper.cc @@ -12160,7 +12156,6 @@ add_executable(flow_control_test src/core/ext/upb-gen/google/protobuf/descriptor.upb_minitable.c src/core/ext/upb-gen/google/rpc/status.upb_minitable.c src/core/lib/debug/trace.cc - src/core/lib/event_engine/memory_allocator.cc src/core/lib/experiments/config.cc src/core/lib/experiments/experiments.cc src/core/lib/gprpp/status_helper.cc @@ -12246,7 +12241,6 @@ add_executable(for_each_test src/core/ext/upb-gen/google/protobuf/descriptor.upb_minitable.c src/core/ext/upb-gen/google/rpc/status.upb_minitable.c src/core/lib/debug/trace.cc - src/core/lib/event_engine/memory_allocator.cc src/core/lib/experiments/config.cc src/core/lib/experiments/experiments.cc src/core/lib/gprpp/status_helper.cc @@ -15024,7 +15018,6 @@ add_executable(interceptor_list_test src/core/ext/upb-gen/google/protobuf/descriptor.upb_minitable.c src/core/ext/upb-gen/google/rpc/status.upb_minitable.c src/core/lib/debug/trace.cc - src/core/lib/event_engine/memory_allocator.cc src/core/lib/experiments/config.cc src/core/lib/experiments/experiments.cc src/core/lib/gprpp/status_helper.cc @@ -15948,7 +15941,6 @@ add_executable(map_pipe_test src/core/ext/upb-gen/google/protobuf/descriptor.upb_minitable.c src/core/ext/upb-gen/google/rpc/status.upb_minitable.c src/core/lib/debug/trace.cc - src/core/lib/event_engine/memory_allocator.cc src/core/lib/experiments/config.cc src/core/lib/experiments/experiments.cc src/core/lib/gprpp/status_helper.cc @@ -24645,7 +24637,6 @@ add_executable(test_core_transport_chaotic_good_frame_test src/core/lib/event_engine/default_event_engine_factory.cc src/core/lib/event_engine/event_engine.cc src/core/lib/event_engine/forkable.cc - src/core/lib/event_engine/memory_allocator.cc src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc src/core/lib/event_engine/posix_engine/ev_poll_posix.cc src/core/lib/event_engine/posix_engine/event_poller_posix_default.cc diff --git a/Makefile b/Makefile index 224e74adc5e..6df49a7bac0 100644 --- a/Makefile +++ b/Makefile @@ -1444,7 +1444,6 @@ LIBGRPC_SRC = \ src/core/lib/event_engine/default_event_engine_factory.cc \ src/core/lib/event_engine/event_engine.cc \ src/core/lib/event_engine/forkable.cc \ - src/core/lib/event_engine/memory_allocator.cc \ src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc \ src/core/lib/event_engine/posix_engine/ev_poll_posix.cc \ src/core/lib/event_engine/posix_engine/event_poller_posix_default.cc \ @@ -2023,7 +2022,6 @@ LIBGRPC_UNSECURE_SRC = \ src/core/lib/event_engine/default_event_engine_factory.cc \ src/core/lib/event_engine/event_engine.cc \ src/core/lib/event_engine/forkable.cc \ - src/core/lib/event_engine/memory_allocator.cc \ src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc \ src/core/lib/event_engine/posix_engine/ev_poll_posix.cc \ src/core/lib/event_engine/posix_engine/event_poller_posix_default.cc \ diff --git a/Package.swift b/Package.swift index 9e501b405fd..7c9d9ce10e9 100644 --- a/Package.swift +++ b/Package.swift @@ -1260,7 +1260,6 @@ let package = Package( "src/core/lib/event_engine/forkable.h", "src/core/lib/event_engine/grpc_polled_fd.h", "src/core/lib/event_engine/handle_containers.h", - "src/core/lib/event_engine/memory_allocator.cc", "src/core/lib/event_engine/memory_allocator_factory.h", "src/core/lib/event_engine/nameser.h", "src/core/lib/event_engine/poller.h", diff --git a/build_autogenerated.yaml b/build_autogenerated.yaml index 392481ce4cc..f5ea18449e2 100644 --- a/build_autogenerated.yaml +++ b/build_autogenerated.yaml @@ -1695,7 +1695,6 @@ libs: - src/core/lib/event_engine/default_event_engine_factory.cc - src/core/lib/event_engine/event_engine.cc - src/core/lib/event_engine/forkable.cc - - src/core/lib/event_engine/memory_allocator.cc - src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc - src/core/lib/event_engine/posix_engine/ev_poll_posix.cc - src/core/lib/event_engine/posix_engine/event_poller_posix_default.cc @@ -2776,7 +2775,6 @@ libs: - src/core/lib/event_engine/default_event_engine_factory.cc - src/core/lib/event_engine/event_engine.cc - src/core/lib/event_engine/forkable.cc - - src/core/lib/event_engine/memory_allocator.cc - src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc - src/core/lib/event_engine/posix_engine/ev_poll_posix.cc - src/core/lib/event_engine/posix_engine/event_poller_posix_default.cc @@ -4820,7 +4818,6 @@ libs: - src/core/lib/event_engine/default_event_engine_factory.cc - src/core/lib/event_engine/event_engine.cc - src/core/lib/event_engine/forkable.cc - - src/core/lib/event_engine/memory_allocator.cc - src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc - src/core/lib/event_engine/posix_engine/ev_poll_posix.cc - src/core/lib/event_engine/posix_engine/event_poller_posix_default.cc @@ -7310,7 +7307,6 @@ targets: - src/core/ext/upb-gen/google/protobuf/descriptor.upb_minitable.c - src/core/ext/upb-gen/google/rpc/status.upb_minitable.c - src/core/lib/debug/trace.cc - - src/core/lib/event_engine/memory_allocator.cc - src/core/lib/experiments/config.cc - src/core/lib/experiments/experiments.cc - src/core/lib/gprpp/status_helper.cc @@ -9295,7 +9291,6 @@ targets: - src/core/ext/upb-gen/google/protobuf/descriptor.upb_minitable.c - src/core/ext/upb-gen/google/rpc/status.upb_minitable.c - src/core/lib/debug/trace.cc - - src/core/lib/event_engine/memory_allocator.cc - src/core/lib/experiments/config.cc - src/core/lib/experiments/experiments.cc - src/core/lib/gprpp/status_helper.cc @@ -9469,7 +9464,6 @@ targets: - src/core/ext/upb-gen/google/protobuf/descriptor.upb_minitable.c - src/core/ext/upb-gen/google/rpc/status.upb_minitable.c - src/core/lib/debug/trace.cc - - src/core/lib/event_engine/memory_allocator.cc - src/core/lib/experiments/config.cc - src/core/lib/experiments/experiments.cc - src/core/lib/gprpp/status_helper.cc @@ -11008,7 +11002,6 @@ targets: - src/core/ext/upb-gen/google/protobuf/descriptor.upb_minitable.c - src/core/ext/upb-gen/google/rpc/status.upb_minitable.c - src/core/lib/debug/trace.cc - - src/core/lib/event_engine/memory_allocator.cc - src/core/lib/experiments/config.cc - src/core/lib/experiments/experiments.cc - src/core/lib/gprpp/status_helper.cc @@ -11639,7 +11632,6 @@ targets: - src/core/ext/upb-gen/google/protobuf/descriptor.upb_minitable.c - src/core/ext/upb-gen/google/rpc/status.upb_minitable.c - src/core/lib/debug/trace.cc - - src/core/lib/event_engine/memory_allocator.cc - src/core/lib/experiments/config.cc - src/core/lib/experiments/experiments.cc - src/core/lib/gprpp/status_helper.cc @@ -17161,7 +17153,6 @@ targets: - src/core/lib/event_engine/default_event_engine_factory.cc - src/core/lib/event_engine/event_engine.cc - src/core/lib/event_engine/forkable.cc - - src/core/lib/event_engine/memory_allocator.cc - src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc - src/core/lib/event_engine/posix_engine/ev_poll_posix.cc - src/core/lib/event_engine/posix_engine/event_poller_posix_default.cc diff --git a/config.m4 b/config.m4 index 894bef129aa..f4f52a0044c 100644 --- a/config.m4 +++ b/config.m4 @@ -534,7 +534,6 @@ if test "$PHP_GRPC" != "no"; then src/core/lib/event_engine/default_event_engine_factory.cc \ src/core/lib/event_engine/event_engine.cc \ src/core/lib/event_engine/forkable.cc \ - src/core/lib/event_engine/memory_allocator.cc \ src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc \ src/core/lib/event_engine/posix_engine/ev_poll_posix.cc \ src/core/lib/event_engine/posix_engine/event_poller_posix_default.cc \ diff --git a/config.w32 b/config.w32 index f778ae8e4b0..52ac38f1204 100644 --- a/config.w32 +++ b/config.w32 @@ -499,7 +499,6 @@ if (PHP_GRPC != "no") { "src\\core\\lib\\event_engine\\default_event_engine_factory.cc " + "src\\core\\lib\\event_engine\\event_engine.cc " + "src\\core\\lib\\event_engine\\forkable.cc " + - "src\\core\\lib\\event_engine\\memory_allocator.cc " + "src\\core\\lib\\event_engine\\posix_engine\\ev_epoll1_linux.cc " + "src\\core\\lib\\event_engine\\posix_engine\\ev_poll_posix.cc " + "src\\core\\lib\\event_engine\\posix_engine\\event_poller_posix_default.cc " + diff --git a/gRPC-Core.podspec b/gRPC-Core.podspec index a1a61b62611..303ac9ad5b2 100644 --- a/gRPC-Core.podspec +++ b/gRPC-Core.podspec @@ -1363,7 +1363,6 @@ Pod::Spec.new do |s| 'src/core/lib/event_engine/forkable.h', 'src/core/lib/event_engine/grpc_polled_fd.h', 'src/core/lib/event_engine/handle_containers.h', - 'src/core/lib/event_engine/memory_allocator.cc', 'src/core/lib/event_engine/memory_allocator_factory.h', 'src/core/lib/event_engine/nameser.h', 'src/core/lib/event_engine/poller.h', diff --git a/grpc.gemspec b/grpc.gemspec index aef58159c38..4b796f508bd 100644 --- a/grpc.gemspec +++ b/grpc.gemspec @@ -1266,7 +1266,6 @@ Gem::Specification.new do |s| s.files += %w( src/core/lib/event_engine/forkable.h ) s.files += %w( src/core/lib/event_engine/grpc_polled_fd.h ) s.files += %w( src/core/lib/event_engine/handle_containers.h ) - s.files += %w( src/core/lib/event_engine/memory_allocator.cc ) s.files += %w( src/core/lib/event_engine/memory_allocator_factory.h ) s.files += %w( src/core/lib/event_engine/nameser.h ) s.files += %w( src/core/lib/event_engine/poller.h ) diff --git a/grpc.gyp b/grpc.gyp index 7a29bd04e94..4b043c457b2 100644 --- a/grpc.gyp +++ b/grpc.gyp @@ -764,7 +764,6 @@ 'src/core/lib/event_engine/default_event_engine_factory.cc', 'src/core/lib/event_engine/event_engine.cc', 'src/core/lib/event_engine/forkable.cc', - 'src/core/lib/event_engine/memory_allocator.cc', 'src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc', 'src/core/lib/event_engine/posix_engine/ev_poll_posix.cc', 'src/core/lib/event_engine/posix_engine/event_poller_posix_default.cc', @@ -1285,7 +1284,6 @@ 'src/core/lib/event_engine/default_event_engine_factory.cc', 'src/core/lib/event_engine/event_engine.cc', 'src/core/lib/event_engine/forkable.cc', - 'src/core/lib/event_engine/memory_allocator.cc', 'src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc', 'src/core/lib/event_engine/posix_engine/ev_poll_posix.cc', 'src/core/lib/event_engine/posix_engine/event_poller_posix_default.cc', @@ -2065,7 +2063,6 @@ 'src/core/lib/event_engine/default_event_engine_factory.cc', 'src/core/lib/event_engine/event_engine.cc', 'src/core/lib/event_engine/forkable.cc', - 'src/core/lib/event_engine/memory_allocator.cc', 'src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc', 'src/core/lib/event_engine/posix_engine/ev_poll_posix.cc', 'src/core/lib/event_engine/posix_engine/event_poller_posix_default.cc', diff --git a/include/grpc/event_engine/internal/memory_allocator_impl.h b/include/grpc/event_engine/internal/memory_allocator_impl.h index 8397b3d9706..e34ffc7f9c2 100644 --- a/include/grpc/event_engine/internal/memory_allocator_impl.h +++ b/include/grpc/event_engine/internal/memory_allocator_impl.h @@ -50,6 +50,12 @@ class MemoryAllocatorImpl /// request.max() inclusively. virtual size_t Reserve(MemoryRequest request) = 0; + /// Allocate a slice, using MemoryRequest to size the number of returned + /// bytes. For a variable length request, check the returned slice length to + /// verify how much memory was allocated. Takes care of reserving memory for + /// any relevant control structures also. + virtual grpc_slice MakeSlice(MemoryRequest request) = 0; + /// Release some bytes that were previously reserved. /// If more bytes are released than were reserved, we will have undefined /// behavior. diff --git a/include/grpc/event_engine/memory_allocator.h b/include/grpc/event_engine/memory_allocator.h index b3143d8dd6a..cd14e3a9337 100644 --- a/include/grpc/event_engine/memory_allocator.h +++ b/include/grpc/event_engine/memory_allocator.h @@ -134,7 +134,9 @@ class MemoryAllocator { /// bytes. For a variable length request, check the returned slice length to /// verify how much memory was allocated. Takes care of reserving memory for /// any relevant control structures also. - grpc_slice MakeSlice(MemoryRequest request); + grpc_slice MakeSlice(MemoryRequest request) { + return allocator_->MakeSlice(request); + } /// A C++ allocator for containers of T. template diff --git a/include/grpc/impl/channel_arg_names.h b/include/grpc/impl/channel_arg_names.h index b4cece27c9e..534300f22c2 100644 --- a/include/grpc/impl/channel_arg_names.h +++ b/include/grpc/impl/channel_arg_names.h @@ -384,6 +384,11 @@ * Defaults to 250ms. */ #define GRPC_ARG_HAPPY_EYEBALLS_CONNECTION_ATTEMPT_DELAY_MS \ "grpc.happy_eyeballs_connection_attempt_delay_ms" +/** It accepts a MemoryAllocatorFactory as input and If specified, it forces + * the default event engine to use memory allocators created using the provided + * factory. */ +#define GRPC_ARG_EVENT_ENGINE_USE_MEMORY_ALLOCATOR_FACTORY \ + "grpc.event_engine_use_memory_allocator_factory" /** \} */ #endif /* GRPC_IMPL_CHANNEL_ARG_NAMES_H */ diff --git a/package.xml b/package.xml index 98876682011..e0e276e52c7 100644 --- a/package.xml +++ b/package.xml @@ -1248,7 +1248,6 @@ - diff --git a/src/core/BUILD b/src/core/BUILD index ffae458b39a..449649facdc 100644 --- a/src/core/BUILD +++ b/src/core/BUILD @@ -1163,9 +1163,6 @@ grpc_cc_library( grpc_cc_library( name = "event_engine_memory_allocator", - srcs = [ - "lib/event_engine/memory_allocator.cc", - ], hdrs = [ "//:include/grpc/event_engine/internal/memory_allocator_impl.h", "//:include/grpc/event_engine/memory_allocator.h", @@ -1175,7 +1172,6 @@ grpc_cc_library( language = "c++", deps = [ "slice", - "slice_refcount", "//:gpr_platform", ], ) @@ -1221,6 +1217,7 @@ grpc_cc_library( "race", "resource_quota_trace", "seq", + "slice_refcount", "time", "useful", "//:gpr", diff --git a/src/core/lib/event_engine/memory_allocator.cc b/src/core/lib/event_engine/memory_allocator.cc deleted file mode 100644 index 69ece21c294..00000000000 --- a/src/core/lib/event_engine/memory_allocator.cc +++ /dev/null @@ -1,74 +0,0 @@ -// Copyright 2021 gRPC authors. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#include - -#include -#include - -#include -#include -#include - -#include -#include -#include - -#include "src/core/lib/slice/slice_refcount.h" - -namespace grpc_event_engine { -namespace experimental { - -namespace { - -// Reference count for a slice allocated by MemoryAllocator::MakeSlice. -// Takes care of releasing memory back when the slice is destroyed. -class SliceRefCount : public grpc_slice_refcount { - public: - SliceRefCount(std::shared_ptr allocator, - size_t size) - : grpc_slice_refcount(Destroy), - allocator_(std::move(allocator)), - size_(size) { - // Nothing to do here. - } - ~SliceRefCount() { allocator_->Release(size_); } - - private: - static void Destroy(grpc_slice_refcount* p) { - auto* rc = static_cast(p); - rc->~SliceRefCount(); - free(rc); - } - - std::shared_ptr allocator_; - size_t size_; -}; - -} // namespace - -grpc_slice MemoryAllocator::MakeSlice(MemoryRequest request) { - auto size = Reserve(request.Increase(sizeof(SliceRefCount))); - void* p = malloc(size); - new (p) SliceRefCount(allocator_, size); - grpc_slice slice; - slice.refcount = static_cast(p); - slice.data.refcounted.bytes = - static_cast(p) + sizeof(SliceRefCount); - slice.data.refcounted.length = size - sizeof(SliceRefCount); - return slice; -} - -} // namespace experimental -} // namespace grpc_event_engine diff --git a/src/core/lib/event_engine/posix_engine/tcp_socket_utils.cc b/src/core/lib/event_engine/posix_engine/tcp_socket_utils.cc index c5b2277d6a7..76e1b0a57e1 100644 --- a/src/core/lib/event_engine/posix_engine/tcp_socket_utils.cc +++ b/src/core/lib/event_engine/posix_engine/tcp_socket_utils.cc @@ -25,6 +25,7 @@ #include "absl/types/optional.h" #include +#include #include #include "src/core/lib/gpr/useful.h" @@ -209,6 +210,13 @@ PosixTcpOptions TcpOptionsFromEndpointConfig(const EndpointConfig& config) { options.socket_mutator = grpc_socket_mutator_ref(static_cast(value)); } + value = + config.GetVoidPointer(GRPC_ARG_EVENT_ENGINE_USE_MEMORY_ALLOCATOR_FACTORY); + if (value != nullptr) { + options.memory_allocator_factory = + static_cast( + value); + } return options; } diff --git a/src/core/lib/event_engine/posix_engine/tcp_socket_utils.h b/src/core/lib/event_engine/posix_engine/tcp_socket_utils.h index 278e70ddbdd..83b52be657c 100644 --- a/src/core/lib/event_engine/posix_engine/tcp_socket_utils.h +++ b/src/core/lib/event_engine/posix_engine/tcp_socket_utils.h @@ -26,6 +26,7 @@ #include #include +#include #include #include @@ -75,6 +76,8 @@ struct PosixTcpOptions { int dscp = kDscpNotSet; grpc_core::RefCountedPtr resource_quota; struct grpc_socket_mutator* socket_mutator = nullptr; + grpc_event_engine::experimental::MemoryAllocatorFactory* + memory_allocator_factory = nullptr; PosixTcpOptions() = default; // Move ctor PosixTcpOptions(PosixTcpOptions&& other) noexcept { @@ -89,6 +92,8 @@ struct PosixTcpOptions { } socket_mutator = std::exchange(other.socket_mutator, nullptr); resource_quota = std::move(other.resource_quota); + memory_allocator_factory = + std::exchange(other.memory_allocator_factory, nullptr); CopyIntegerOptions(other); return *this; } @@ -98,6 +103,7 @@ struct PosixTcpOptions { socket_mutator = grpc_socket_mutator_ref(other.socket_mutator); } resource_quota = other.resource_quota; + memory_allocator_factory = other.memory_allocator_factory; CopyIntegerOptions(other); } // Copy assignment @@ -113,6 +119,7 @@ struct PosixTcpOptions { socket_mutator = grpc_socket_mutator_ref(other.socket_mutator); } resource_quota = other.resource_quota; + memory_allocator_factory = other.memory_allocator_factory; CopyIntegerOptions(other); return *this; } diff --git a/src/core/lib/resource_quota/memory_quota.cc b/src/core/lib/resource_quota/memory_quota.cc index 6335a54c484..0e63e45b4df 100644 --- a/src/core/lib/resource_quota/memory_quota.cc +++ b/src/core/lib/resource_quota/memory_quota.cc @@ -20,11 +20,19 @@ #include #include +#include +#include +#include +#include #include +#include #include "absl/status/status.h" #include "absl/strings/str_cat.h" +#include +#include + #include "src/core/lib/debug/trace.h" #include "src/core/lib/gpr/useful.h" #include "src/core/lib/gprpp/mpscq.h" @@ -34,6 +42,7 @@ #include "src/core/lib/promise/race.h" #include "src/core/lib/promise/seq.h" #include "src/core/lib/resource_quota/trace.h" +#include "src/core/lib/slice/slice_refcount.h" namespace grpc_core { @@ -90,6 +99,39 @@ class MemoryQuotaTracker { Mutex mu_; std::vector> quotas_ ABSL_GUARDED_BY(mu_); }; + +// Reference count for a slice allocated by MemoryAllocator::MakeSlice. +// Takes care of releasing memory back when the slice is destroyed. +class SliceRefCount : public grpc_slice_refcount { + public: + SliceRefCount( + std::shared_ptr< + grpc_event_engine::experimental::internal::MemoryAllocatorImpl> + allocator, + size_t size) + : grpc_slice_refcount(Destroy), + allocator_(std::move(allocator)), + size_(size) { + // Nothing to do here. + } + ~SliceRefCount() { + allocator_->Release(size_); + allocator_.reset(); + } + + private: + static void Destroy(grpc_slice_refcount* p) { + auto* rc = static_cast(p); + rc->~SliceRefCount(); + free(rc); + } + + std::shared_ptr< + grpc_event_engine::experimental::internal::MemoryAllocatorImpl> + allocator_; + size_t size_; +}; + } // namespace // @@ -337,6 +379,18 @@ void GrpcMemoryAllocatorImpl::Replenish() { free_bytes_.fetch_add(amount, std::memory_order_acq_rel); } +grpc_slice GrpcMemoryAllocatorImpl::MakeSlice(MemoryRequest request) { + auto size = Reserve(request.Increase(sizeof(SliceRefCount))); + void* p = malloc(size); + new (p) SliceRefCount(shared_from_this(), size); + grpc_slice slice; + slice.refcount = static_cast(p); + slice.data.refcounted.bytes = + static_cast(p) + sizeof(SliceRefCount); + slice.data.refcounted.length = size - sizeof(SliceRefCount); + return slice; +} + // // BasicMemoryQuota // diff --git a/src/core/lib/resource_quota/memory_quota.h b/src/core/lib/resource_quota/memory_quota.h index a76f2594d20..4f38b8dd32d 100644 --- a/src/core/lib/resource_quota/memory_quota.h +++ b/src/core/lib/resource_quota/memory_quota.h @@ -400,6 +400,12 @@ class GrpcMemoryAllocatorImpl final : public EventEngineMemoryAllocatorImpl { // Returns the number of bytes reserved. size_t Reserve(MemoryRequest request) override; + /// Allocate a slice, using MemoryRequest to size the number of returned + /// bytes. For a variable length request, check the returned slice length to + /// verify how much memory was allocated. Takes care of reserving memory for + /// any relevant control structures also. + grpc_slice MakeSlice(MemoryRequest request) override; + // Release some bytes that were previously reserved. void Release(size_t n) override { // Add the released memory to our free bytes counter... if this increases diff --git a/src/python/grpcio/grpc_core_dependencies.py b/src/python/grpcio/grpc_core_dependencies.py index afbe5ec3ef0..d6304bccbdc 100644 --- a/src/python/grpcio/grpc_core_dependencies.py +++ b/src/python/grpcio/grpc_core_dependencies.py @@ -508,7 +508,6 @@ CORE_SOURCE_FILES = [ 'src/core/lib/event_engine/default_event_engine_factory.cc', 'src/core/lib/event_engine/event_engine.cc', 'src/core/lib/event_engine/forkable.cc', - 'src/core/lib/event_engine/memory_allocator.cc', 'src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc', 'src/core/lib/event_engine/posix_engine/ev_poll_posix.cc', 'src/core/lib/event_engine/posix_engine/event_poller_posix_default.cc', diff --git a/tools/doxygen/Doxyfile.c++.internal b/tools/doxygen/Doxyfile.c++.internal index 5ff3e2299c9..21666ae9e51 100644 --- a/tools/doxygen/Doxyfile.c++.internal +++ b/tools/doxygen/Doxyfile.c++.internal @@ -2265,7 +2265,6 @@ src/core/lib/event_engine/forkable.cc \ src/core/lib/event_engine/forkable.h \ src/core/lib/event_engine/grpc_polled_fd.h \ src/core/lib/event_engine/handle_containers.h \ -src/core/lib/event_engine/memory_allocator.cc \ src/core/lib/event_engine/memory_allocator_factory.h \ src/core/lib/event_engine/nameser.h \ src/core/lib/event_engine/poller.h \ diff --git a/tools/doxygen/Doxyfile.core.internal b/tools/doxygen/Doxyfile.core.internal index 9ba3a65871f..b7b1ae5bf25 100644 --- a/tools/doxygen/Doxyfile.core.internal +++ b/tools/doxygen/Doxyfile.core.internal @@ -2041,7 +2041,6 @@ src/core/lib/event_engine/forkable.cc \ src/core/lib/event_engine/forkable.h \ src/core/lib/event_engine/grpc_polled_fd.h \ src/core/lib/event_engine/handle_containers.h \ -src/core/lib/event_engine/memory_allocator.cc \ src/core/lib/event_engine/memory_allocator_factory.h \ src/core/lib/event_engine/nameser.h \ src/core/lib/event_engine/poller.h \