// Copyright 2021 The 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. #ifndef GRPC_EVENT_ENGINE_EVENT_ENGINE_H #define GRPC_EVENT_ENGINE_EVENT_ENGINE_H #include <grpc/support/port_platform.h> #include <functional> #include <vector> #include "absl/functional/any_invocable.h" #include "absl/status/status.h" #include "absl/status/statusor.h" #include <grpc/event_engine/endpoint_config.h> #include <grpc/event_engine/memory_allocator.h> #include <grpc/event_engine/port.h> #include <grpc/event_engine/slice_buffer.h> // TODO(vigneshbabu): Define the Endpoint::Write metrics collection system namespace grpc_event_engine { namespace experimental { //////////////////////////////////////////////////////////////////////////////// /// The EventEngine Interface /// /// Overview /// -------- /// /// The EventEngine encapsulates all platform-specific behaviors related to low /// level network I/O, timers, asynchronous execution, and DNS resolution. /// /// This interface allows developers to provide their own event management and /// network stacks. Motivating uses cases for supporting custom EventEngines /// include the ability to hook into external event loops, and using different /// EventEngine instances for each channel to better insulate network I/O and /// callback processing from other channels. /// /// A default cross-platform EventEngine instance is provided by gRPC. /// /// Lifespan and Ownership /// ---------------------- /// /// gRPC takes shared ownership of EventEngines via std::shared_ptrs to ensure /// that the engines remain available until they are no longer needed. Depending /// on the use case, engines may live until gRPC is shut down. /// /// EXAMPLE USAGE (Not yet implemented) /// /// Custom EventEngines can be specified per channel, and allow configuration /// for both clients and servers. To set a custom EventEngine for a client /// channel, you can do something like the following: /// /// ChannelArguments args; /// std::shared_ptr<EventEngine> engine = std::make_shared<MyEngine>(...); /// args.SetEventEngine(engine); /// MyAppClient client(grpc::CreateCustomChannel( /// "localhost:50051", grpc::InsecureChannelCredentials(), args)); /// /// A gRPC server can use a custom EventEngine by calling the /// ServerBuilder::SetEventEngine method: /// /// ServerBuilder builder; /// std::shared_ptr<EventEngine> engine = std::make_shared<MyEngine>(...); /// builder.SetEventEngine(engine); /// std::unique_ptr<Server> server(builder.BuildAndStart()); /// server->Wait(); /// /// /// Blocking EventEngine Callbacks /// ----------------------------- /// /// Doing blocking work in EventEngine callbacks is generally not advisable. /// While gRPC's default EventEngine implementations have some capacity to scale /// their thread pools to avoid starvation, this is not an instantaneous /// process. Further, user-provided EventEngines may not be optimized to handle /// excessive blocking work at all. /// /// *Best Practice* : Occasional blocking work may be fine, but we do not /// recommend running a mostly blocking workload in EventEngine threads. /// //////////////////////////////////////////////////////////////////////////////// class EventEngine : public std::enable_shared_from_this<EventEngine> { … }; /// Replace gRPC's default EventEngine factory. /// /// Applications may call \a SetEventEngineFactory at any time to replace the /// default factory used within gRPC. EventEngines will be created when /// necessary, when they are otherwise not provided by the application. /// /// To be certain that none of the gRPC-provided built-in EventEngines are /// created, applications must set a custom EventEngine factory method *before* /// grpc is initialized. void SetEventEngineFactory( absl::AnyInvocable<std::unique_ptr<EventEngine>()> factory); /// Reset gRPC's EventEngine factory to the built-in default. /// /// Applications that have called \a SetEventEngineFactory can remove their /// custom factory using this method. The built-in EventEngine factories will be /// used going forward. This has no affect on any EventEngines that were created /// using the previous factories. void EventEngineFactoryReset(); /// Create an EventEngine using the default factory. std::unique_ptr<EventEngine> CreateEventEngine(); } // namespace experimental } // namespace grpc_event_engine #endif // GRPC_EVENT_ENGINE_EVENT_ENGINE_H