xref: /aosp_15_r20/external/grpc-grpc/include/grpcpp/server.h (revision cc02d7e222339f7a4f6ba5f422e6413f4bd931f2)
1*cc02d7e2SAndroid Build Coastguard Worker //
2*cc02d7e2SAndroid Build Coastguard Worker //
3*cc02d7e2SAndroid Build Coastguard Worker // Copyright 2015 gRPC authors.
4*cc02d7e2SAndroid Build Coastguard Worker //
5*cc02d7e2SAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License");
6*cc02d7e2SAndroid Build Coastguard Worker // you may not use this file except in compliance with the License.
7*cc02d7e2SAndroid Build Coastguard Worker // You may obtain a copy of the License at
8*cc02d7e2SAndroid Build Coastguard Worker //
9*cc02d7e2SAndroid Build Coastguard Worker //     http://www.apache.org/licenses/LICENSE-2.0
10*cc02d7e2SAndroid Build Coastguard Worker //
11*cc02d7e2SAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
12*cc02d7e2SAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS,
13*cc02d7e2SAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*cc02d7e2SAndroid Build Coastguard Worker // See the License for the specific language governing permissions and
15*cc02d7e2SAndroid Build Coastguard Worker // limitations under the License.
16*cc02d7e2SAndroid Build Coastguard Worker //
17*cc02d7e2SAndroid Build Coastguard Worker //
18*cc02d7e2SAndroid Build Coastguard Worker 
19*cc02d7e2SAndroid Build Coastguard Worker #ifndef GRPCPP_SERVER_H
20*cc02d7e2SAndroid Build Coastguard Worker #define GRPCPP_SERVER_H
21*cc02d7e2SAndroid Build Coastguard Worker 
22*cc02d7e2SAndroid Build Coastguard Worker #include <list>
23*cc02d7e2SAndroid Build Coastguard Worker #include <memory>
24*cc02d7e2SAndroid Build Coastguard Worker #include <vector>
25*cc02d7e2SAndroid Build Coastguard Worker 
26*cc02d7e2SAndroid Build Coastguard Worker #include <grpc/compression.h>
27*cc02d7e2SAndroid Build Coastguard Worker #include <grpc/support/atm.h>
28*cc02d7e2SAndroid Build Coastguard Worker #include <grpc/support/port_platform.h>
29*cc02d7e2SAndroid Build Coastguard Worker #include <grpcpp/channel.h>
30*cc02d7e2SAndroid Build Coastguard Worker #include <grpcpp/completion_queue.h>
31*cc02d7e2SAndroid Build Coastguard Worker #include <grpcpp/health_check_service_interface.h>
32*cc02d7e2SAndroid Build Coastguard Worker #include <grpcpp/impl/call.h>
33*cc02d7e2SAndroid Build Coastguard Worker #include <grpcpp/impl/grpc_library.h>
34*cc02d7e2SAndroid Build Coastguard Worker #include <grpcpp/impl/rpc_service_method.h>
35*cc02d7e2SAndroid Build Coastguard Worker #include <grpcpp/security/server_credentials.h>
36*cc02d7e2SAndroid Build Coastguard Worker #include <grpcpp/server_interface.h>
37*cc02d7e2SAndroid Build Coastguard Worker #include <grpcpp/support/channel_arguments.h>
38*cc02d7e2SAndroid Build Coastguard Worker #include <grpcpp/support/client_interceptor.h>
39*cc02d7e2SAndroid Build Coastguard Worker #include <grpcpp/support/config.h>
40*cc02d7e2SAndroid Build Coastguard Worker #include <grpcpp/support/status.h>
41*cc02d7e2SAndroid Build Coastguard Worker 
42*cc02d7e2SAndroid Build Coastguard Worker struct grpc_server;
43*cc02d7e2SAndroid Build Coastguard Worker 
44*cc02d7e2SAndroid Build Coastguard Worker namespace grpc {
45*cc02d7e2SAndroid Build Coastguard Worker class AsyncGenericService;
46*cc02d7e2SAndroid Build Coastguard Worker class ServerContext;
47*cc02d7e2SAndroid Build Coastguard Worker class ServerInitializer;
48*cc02d7e2SAndroid Build Coastguard Worker 
49*cc02d7e2SAndroid Build Coastguard Worker namespace internal {
50*cc02d7e2SAndroid Build Coastguard Worker class ExternalConnectionAcceptorImpl;
51*cc02d7e2SAndroid Build Coastguard Worker }  // namespace internal
52*cc02d7e2SAndroid Build Coastguard Worker 
53*cc02d7e2SAndroid Build Coastguard Worker /// Represents a gRPC server.
54*cc02d7e2SAndroid Build Coastguard Worker ///
55*cc02d7e2SAndroid Build Coastguard Worker /// Use a \a grpc::ServerBuilder to create, configure, and start
56*cc02d7e2SAndroid Build Coastguard Worker /// \a Server instances.
57*cc02d7e2SAndroid Build Coastguard Worker class Server : public ServerInterface, private internal::GrpcLibrary {
58*cc02d7e2SAndroid Build Coastguard Worker  public:
59*cc02d7e2SAndroid Build Coastguard Worker   ~Server() ABSL_LOCKS_EXCLUDED(mu_) override;
60*cc02d7e2SAndroid Build Coastguard Worker 
61*cc02d7e2SAndroid Build Coastguard Worker   /// Block until the server shuts down.
62*cc02d7e2SAndroid Build Coastguard Worker   ///
63*cc02d7e2SAndroid Build Coastguard Worker   /// \warning The server must be either shutting down or some other thread must
64*cc02d7e2SAndroid Build Coastguard Worker   /// call \a Shutdown for this function to ever return.
65*cc02d7e2SAndroid Build Coastguard Worker   void Wait() ABSL_LOCKS_EXCLUDED(mu_) override;
66*cc02d7e2SAndroid Build Coastguard Worker 
67*cc02d7e2SAndroid Build Coastguard Worker   /// Global callbacks are a set of hooks that are called when server
68*cc02d7e2SAndroid Build Coastguard Worker   /// events occur.  \a SetGlobalCallbacks method is used to register
69*cc02d7e2SAndroid Build Coastguard Worker   /// the hooks with gRPC.  Note that
70*cc02d7e2SAndroid Build Coastguard Worker   /// the \a GlobalCallbacks instance will be shared among all
71*cc02d7e2SAndroid Build Coastguard Worker   /// \a Server instances in an application and can be set exactly
72*cc02d7e2SAndroid Build Coastguard Worker   /// once per application.
73*cc02d7e2SAndroid Build Coastguard Worker   class GlobalCallbacks {
74*cc02d7e2SAndroid Build Coastguard Worker    public:
~GlobalCallbacks()75*cc02d7e2SAndroid Build Coastguard Worker     virtual ~GlobalCallbacks() {}
76*cc02d7e2SAndroid Build Coastguard Worker     /// Called before server is created.
UpdateArguments(ChannelArguments *)77*cc02d7e2SAndroid Build Coastguard Worker     virtual void UpdateArguments(ChannelArguments* /*args*/) {}
78*cc02d7e2SAndroid Build Coastguard Worker     /// Called before application callback for each synchronous server request
79*cc02d7e2SAndroid Build Coastguard Worker     virtual void PreSynchronousRequest(ServerContext* context) = 0;
80*cc02d7e2SAndroid Build Coastguard Worker     /// Called after application callback for each synchronous server request
81*cc02d7e2SAndroid Build Coastguard Worker     virtual void PostSynchronousRequest(ServerContext* context) = 0;
82*cc02d7e2SAndroid Build Coastguard Worker     /// Called before server is started.
PreServerStart(Server *)83*cc02d7e2SAndroid Build Coastguard Worker     virtual void PreServerStart(Server* /*server*/) {}
84*cc02d7e2SAndroid Build Coastguard Worker     /// Called after a server port is added.
AddPort(Server *,const std::string &,ServerCredentials *,int)85*cc02d7e2SAndroid Build Coastguard Worker     virtual void AddPort(Server* /*server*/, const std::string& /*addr*/,
86*cc02d7e2SAndroid Build Coastguard Worker                          ServerCredentials* /*creds*/, int /*port*/) {}
87*cc02d7e2SAndroid Build Coastguard Worker   };
88*cc02d7e2SAndroid Build Coastguard Worker   /// Set the global callback object. Can only be called once per application.
89*cc02d7e2SAndroid Build Coastguard Worker   /// Does not take ownership of callbacks, and expects the pointed to object
90*cc02d7e2SAndroid Build Coastguard Worker   /// to be alive until all server objects in the process have been destroyed.
91*cc02d7e2SAndroid Build Coastguard Worker   /// The same \a GlobalCallbacks object will be used throughout the
92*cc02d7e2SAndroid Build Coastguard Worker   /// application and is shared among all \a Server objects.
93*cc02d7e2SAndroid Build Coastguard Worker   static void SetGlobalCallbacks(GlobalCallbacks* callbacks);
94*cc02d7e2SAndroid Build Coastguard Worker 
95*cc02d7e2SAndroid Build Coastguard Worker   /// Returns a \em raw pointer to the underlying \a grpc_server instance.
96*cc02d7e2SAndroid Build Coastguard Worker   /// EXPERIMENTAL:  for internal/test use only
97*cc02d7e2SAndroid Build Coastguard Worker   grpc_server* c_server();
98*cc02d7e2SAndroid Build Coastguard Worker 
99*cc02d7e2SAndroid Build Coastguard Worker   /// Returns the health check service.
GetHealthCheckService()100*cc02d7e2SAndroid Build Coastguard Worker   HealthCheckServiceInterface* GetHealthCheckService() const {
101*cc02d7e2SAndroid Build Coastguard Worker     return health_check_service_.get();
102*cc02d7e2SAndroid Build Coastguard Worker   }
103*cc02d7e2SAndroid Build Coastguard Worker 
104*cc02d7e2SAndroid Build Coastguard Worker   /// Establish a channel for in-process communication
105*cc02d7e2SAndroid Build Coastguard Worker   std::shared_ptr<Channel> InProcessChannel(const ChannelArguments& args);
106*cc02d7e2SAndroid Build Coastguard Worker 
107*cc02d7e2SAndroid Build Coastguard Worker   /// NOTE: class experimental_type is not part of the public API of this class.
108*cc02d7e2SAndroid Build Coastguard Worker   /// TODO(yashykt): Integrate into public API when this is no longer
109*cc02d7e2SAndroid Build Coastguard Worker   /// experimental.
110*cc02d7e2SAndroid Build Coastguard Worker   class experimental_type {
111*cc02d7e2SAndroid Build Coastguard Worker    public:
experimental_type(Server * server)112*cc02d7e2SAndroid Build Coastguard Worker     explicit experimental_type(Server* server) : server_(server) {}
113*cc02d7e2SAndroid Build Coastguard Worker 
114*cc02d7e2SAndroid Build Coastguard Worker     /// Establish a channel for in-process communication with client
115*cc02d7e2SAndroid Build Coastguard Worker     /// interceptors
116*cc02d7e2SAndroid Build Coastguard Worker     std::shared_ptr<Channel> InProcessChannelWithInterceptors(
117*cc02d7e2SAndroid Build Coastguard Worker         const ChannelArguments& args,
118*cc02d7e2SAndroid Build Coastguard Worker         std::vector<
119*cc02d7e2SAndroid Build Coastguard Worker             std::unique_ptr<experimental::ClientInterceptorFactoryInterface>>
120*cc02d7e2SAndroid Build Coastguard Worker             interceptor_creators);
121*cc02d7e2SAndroid Build Coastguard Worker 
122*cc02d7e2SAndroid Build Coastguard Worker    private:
123*cc02d7e2SAndroid Build Coastguard Worker     Server* server_;
124*cc02d7e2SAndroid Build Coastguard Worker   };
125*cc02d7e2SAndroid Build Coastguard Worker 
126*cc02d7e2SAndroid Build Coastguard Worker   /// NOTE: The function experimental() is not stable public API. It is a view
127*cc02d7e2SAndroid Build Coastguard Worker   /// to the experimental components of this class. It may be changed or removed
128*cc02d7e2SAndroid Build Coastguard Worker   /// at any time.
experimental()129*cc02d7e2SAndroid Build Coastguard Worker   experimental_type experimental() { return experimental_type(this); }
130*cc02d7e2SAndroid Build Coastguard Worker 
131*cc02d7e2SAndroid Build Coastguard Worker  protected:
132*cc02d7e2SAndroid Build Coastguard Worker   /// Register a service. This call does not take ownership of the service.
133*cc02d7e2SAndroid Build Coastguard Worker   /// The service must exist for the lifetime of the Server instance.
134*cc02d7e2SAndroid Build Coastguard Worker   bool RegisterService(const std::string* addr, Service* service) override;
135*cc02d7e2SAndroid Build Coastguard Worker 
136*cc02d7e2SAndroid Build Coastguard Worker   /// Try binding the server to the given \a addr endpoint
137*cc02d7e2SAndroid Build Coastguard Worker   /// (port, and optionally including IP address to bind to).
138*cc02d7e2SAndroid Build Coastguard Worker   ///
139*cc02d7e2SAndroid Build Coastguard Worker   /// It can be invoked multiple times. Should be used before
140*cc02d7e2SAndroid Build Coastguard Worker   /// starting the server.
141*cc02d7e2SAndroid Build Coastguard Worker   ///
142*cc02d7e2SAndroid Build Coastguard Worker   /// \param addr The address to try to bind to the server (eg, localhost:1234,
143*cc02d7e2SAndroid Build Coastguard Worker   /// 192.168.1.1:31416, [::1]:27182, etc.).
144*cc02d7e2SAndroid Build Coastguard Worker   /// \param creds The credentials associated with the server.
145*cc02d7e2SAndroid Build Coastguard Worker   ///
146*cc02d7e2SAndroid Build Coastguard Worker   /// \return bound port number on success, 0 on failure.
147*cc02d7e2SAndroid Build Coastguard Worker   ///
148*cc02d7e2SAndroid Build Coastguard Worker   /// \warning It is an error to call this method on an already started server.
149*cc02d7e2SAndroid Build Coastguard Worker   int AddListeningPort(const std::string& addr,
150*cc02d7e2SAndroid Build Coastguard Worker                        ServerCredentials* creds) override;
151*cc02d7e2SAndroid Build Coastguard Worker 
152*cc02d7e2SAndroid Build Coastguard Worker   /// NOTE: This is *NOT* a public API. The server constructors are supposed to
153*cc02d7e2SAndroid Build Coastguard Worker   /// be used by \a ServerBuilder class only. The constructor will be made
154*cc02d7e2SAndroid Build Coastguard Worker   /// 'private' very soon.
155*cc02d7e2SAndroid Build Coastguard Worker   ///
156*cc02d7e2SAndroid Build Coastguard Worker   /// Server constructors. To be used by \a ServerBuilder only.
157*cc02d7e2SAndroid Build Coastguard Worker   ///
158*cc02d7e2SAndroid Build Coastguard Worker   /// \param args The channel args
159*cc02d7e2SAndroid Build Coastguard Worker   ///
160*cc02d7e2SAndroid Build Coastguard Worker   /// \param sync_server_cqs The completion queues to use if the server is a
161*cc02d7e2SAndroid Build Coastguard Worker   /// synchronous server (or a hybrid server). The server polls for new RPCs on
162*cc02d7e2SAndroid Build Coastguard Worker   /// these queues
163*cc02d7e2SAndroid Build Coastguard Worker   ///
164*cc02d7e2SAndroid Build Coastguard Worker   /// \param min_pollers The minimum number of polling threads per server
165*cc02d7e2SAndroid Build Coastguard Worker   /// completion queue (in param sync_server_cqs) to use for listening to
166*cc02d7e2SAndroid Build Coastguard Worker   /// incoming requests (used only in case of sync server)
167*cc02d7e2SAndroid Build Coastguard Worker   ///
168*cc02d7e2SAndroid Build Coastguard Worker   /// \param max_pollers The maximum number of polling threads per server
169*cc02d7e2SAndroid Build Coastguard Worker   /// completion queue (in param sync_server_cqs) to use for listening to
170*cc02d7e2SAndroid Build Coastguard Worker   /// incoming requests (used only in case of sync server)
171*cc02d7e2SAndroid Build Coastguard Worker   ///
172*cc02d7e2SAndroid Build Coastguard Worker   /// \param sync_cq_timeout_msec The timeout to use when calling AsyncNext() on
173*cc02d7e2SAndroid Build Coastguard Worker   /// server completion queues passed via sync_server_cqs param.
174*cc02d7e2SAndroid Build Coastguard Worker   Server(ChannelArguments* args,
175*cc02d7e2SAndroid Build Coastguard Worker          std::shared_ptr<std::vector<std::unique_ptr<ServerCompletionQueue>>>
176*cc02d7e2SAndroid Build Coastguard Worker              sync_server_cqs,
177*cc02d7e2SAndroid Build Coastguard Worker          int min_pollers, int max_pollers, int sync_cq_timeout_msec,
178*cc02d7e2SAndroid Build Coastguard Worker          std::vector<std::shared_ptr<internal::ExternalConnectionAcceptorImpl>>
179*cc02d7e2SAndroid Build Coastguard Worker              acceptors,
180*cc02d7e2SAndroid Build Coastguard Worker          grpc_server_config_fetcher* server_config_fetcher = nullptr,
181*cc02d7e2SAndroid Build Coastguard Worker          grpc_resource_quota* server_rq = nullptr,
182*cc02d7e2SAndroid Build Coastguard Worker          std::vector<
183*cc02d7e2SAndroid Build Coastguard Worker              std::unique_ptr<experimental::ServerInterceptorFactoryInterface>>
184*cc02d7e2SAndroid Build Coastguard Worker              interceptor_creators = std::vector<std::unique_ptr<
185*cc02d7e2SAndroid Build Coastguard Worker                  experimental::ServerInterceptorFactoryInterface>>(),
186*cc02d7e2SAndroid Build Coastguard Worker          experimental::ServerMetricRecorder* server_metric_recorder = nullptr);
187*cc02d7e2SAndroid Build Coastguard Worker 
188*cc02d7e2SAndroid Build Coastguard Worker   /// Start the server.
189*cc02d7e2SAndroid Build Coastguard Worker   ///
190*cc02d7e2SAndroid Build Coastguard Worker   /// \param cqs Completion queues for handling asynchronous services. The
191*cc02d7e2SAndroid Build Coastguard Worker   /// caller is required to keep all completion queues live until the server is
192*cc02d7e2SAndroid Build Coastguard Worker   /// destroyed.
193*cc02d7e2SAndroid Build Coastguard Worker   /// \param num_cqs How many completion queues does \a cqs hold.
194*cc02d7e2SAndroid Build Coastguard Worker   void Start(ServerCompletionQueue** cqs, size_t num_cqs) override;
195*cc02d7e2SAndroid Build Coastguard Worker 
server()196*cc02d7e2SAndroid Build Coastguard Worker   grpc_server* server() override { return server_; }
197*cc02d7e2SAndroid Build Coastguard Worker 
198*cc02d7e2SAndroid Build Coastguard Worker   /// NOTE: This method is not part of the public API for this class.
set_health_check_service(std::unique_ptr<HealthCheckServiceInterface> service)199*cc02d7e2SAndroid Build Coastguard Worker   void set_health_check_service(
200*cc02d7e2SAndroid Build Coastguard Worker       std::unique_ptr<HealthCheckServiceInterface> service) {
201*cc02d7e2SAndroid Build Coastguard Worker     health_check_service_ = std::move(service);
202*cc02d7e2SAndroid Build Coastguard Worker   }
203*cc02d7e2SAndroid Build Coastguard Worker 
context_allocator()204*cc02d7e2SAndroid Build Coastguard Worker   ContextAllocator* context_allocator() { return context_allocator_.get(); }
205*cc02d7e2SAndroid Build Coastguard Worker 
206*cc02d7e2SAndroid Build Coastguard Worker   /// NOTE: This method is not part of the public API for this class.
health_check_service_disabled()207*cc02d7e2SAndroid Build Coastguard Worker   bool health_check_service_disabled() const {
208*cc02d7e2SAndroid Build Coastguard Worker     return health_check_service_disabled_;
209*cc02d7e2SAndroid Build Coastguard Worker   }
210*cc02d7e2SAndroid Build Coastguard Worker 
211*cc02d7e2SAndroid Build Coastguard Worker  private:
212*cc02d7e2SAndroid Build Coastguard Worker   std::vector<std::unique_ptr<experimental::ServerInterceptorFactoryInterface>>*
interceptor_creators()213*cc02d7e2SAndroid Build Coastguard Worker   interceptor_creators() override {
214*cc02d7e2SAndroid Build Coastguard Worker     return &interceptor_creators_;
215*cc02d7e2SAndroid Build Coastguard Worker   }
216*cc02d7e2SAndroid Build Coastguard Worker 
217*cc02d7e2SAndroid Build Coastguard Worker   friend class AsyncGenericService;
218*cc02d7e2SAndroid Build Coastguard Worker   friend class ServerBuilder;
219*cc02d7e2SAndroid Build Coastguard Worker   friend class ServerInitializer;
220*cc02d7e2SAndroid Build Coastguard Worker 
221*cc02d7e2SAndroid Build Coastguard Worker   class SyncRequest;
222*cc02d7e2SAndroid Build Coastguard Worker   class CallbackRequestBase;
223*cc02d7e2SAndroid Build Coastguard Worker   template <class ServerContextType>
224*cc02d7e2SAndroid Build Coastguard Worker   class CallbackRequest;
225*cc02d7e2SAndroid Build Coastguard Worker   class UnimplementedAsyncRequest;
226*cc02d7e2SAndroid Build Coastguard Worker   class UnimplementedAsyncResponse;
227*cc02d7e2SAndroid Build Coastguard Worker 
228*cc02d7e2SAndroid Build Coastguard Worker   /// SyncRequestThreadManager is an implementation of ThreadManager. This class
229*cc02d7e2SAndroid Build Coastguard Worker   /// is responsible for polling for incoming RPCs and calling the RPC handlers.
230*cc02d7e2SAndroid Build Coastguard Worker   /// This is only used in case of a Sync server (i.e a server exposing a sync
231*cc02d7e2SAndroid Build Coastguard Worker   /// interface)
232*cc02d7e2SAndroid Build Coastguard Worker   class SyncRequestThreadManager;
233*cc02d7e2SAndroid Build Coastguard Worker 
234*cc02d7e2SAndroid Build Coastguard Worker   /// Register a generic service. This call does not take ownership of the
235*cc02d7e2SAndroid Build Coastguard Worker   /// service. The service must exist for the lifetime of the Server instance.
236*cc02d7e2SAndroid Build Coastguard Worker   void RegisterAsyncGenericService(AsyncGenericService* service) override;
237*cc02d7e2SAndroid Build Coastguard Worker 
238*cc02d7e2SAndroid Build Coastguard Worker   /// Register a callback-based generic service. This call does not take
239*cc02d7e2SAndroid Build Coastguard Worker   /// ownership of theservice. The service must exist for the lifetime of the
240*cc02d7e2SAndroid Build Coastguard Worker   /// Server instance.
241*cc02d7e2SAndroid Build Coastguard Worker   void RegisterCallbackGenericService(CallbackGenericService* service) override;
242*cc02d7e2SAndroid Build Coastguard Worker 
RegisterContextAllocator(std::unique_ptr<ContextAllocator> context_allocator)243*cc02d7e2SAndroid Build Coastguard Worker   void RegisterContextAllocator(
244*cc02d7e2SAndroid Build Coastguard Worker       std::unique_ptr<ContextAllocator> context_allocator) {
245*cc02d7e2SAndroid Build Coastguard Worker     context_allocator_ = std::move(context_allocator);
246*cc02d7e2SAndroid Build Coastguard Worker   }
247*cc02d7e2SAndroid Build Coastguard Worker 
248*cc02d7e2SAndroid Build Coastguard Worker   void PerformOpsOnCall(internal::CallOpSetInterface* ops,
249*cc02d7e2SAndroid Build Coastguard Worker                         internal::Call* call) override;
250*cc02d7e2SAndroid Build Coastguard Worker 
251*cc02d7e2SAndroid Build Coastguard Worker   void ShutdownInternal(gpr_timespec deadline)
252*cc02d7e2SAndroid Build Coastguard Worker       ABSL_LOCKS_EXCLUDED(mu_) override;
253*cc02d7e2SAndroid Build Coastguard Worker 
max_receive_message_size()254*cc02d7e2SAndroid Build Coastguard Worker   int max_receive_message_size() const override {
255*cc02d7e2SAndroid Build Coastguard Worker     return max_receive_message_size_;
256*cc02d7e2SAndroid Build Coastguard Worker   }
257*cc02d7e2SAndroid Build Coastguard Worker 
call_metric_recording_enabled()258*cc02d7e2SAndroid Build Coastguard Worker   bool call_metric_recording_enabled() const override {
259*cc02d7e2SAndroid Build Coastguard Worker     return call_metric_recording_enabled_;
260*cc02d7e2SAndroid Build Coastguard Worker   }
261*cc02d7e2SAndroid Build Coastguard Worker 
server_metric_recorder()262*cc02d7e2SAndroid Build Coastguard Worker   experimental::ServerMetricRecorder* server_metric_recorder() const override {
263*cc02d7e2SAndroid Build Coastguard Worker     return server_metric_recorder_;
264*cc02d7e2SAndroid Build Coastguard Worker   }
265*cc02d7e2SAndroid Build Coastguard Worker 
266*cc02d7e2SAndroid Build Coastguard Worker   CompletionQueue* CallbackCQ() ABSL_LOCKS_EXCLUDED(mu_) override;
267*cc02d7e2SAndroid Build Coastguard Worker 
268*cc02d7e2SAndroid Build Coastguard Worker   ServerInitializer* initializer();
269*cc02d7e2SAndroid Build Coastguard Worker 
270*cc02d7e2SAndroid Build Coastguard Worker   // Functions to manage the server shutdown ref count. Things that increase
271*cc02d7e2SAndroid Build Coastguard Worker   // the ref count are the running state of the server (take a ref at start and
272*cc02d7e2SAndroid Build Coastguard Worker   // drop it at shutdown) and each running callback RPC.
273*cc02d7e2SAndroid Build Coastguard Worker   void Ref();
274*cc02d7e2SAndroid Build Coastguard Worker   void UnrefWithPossibleNotify() ABSL_LOCKS_EXCLUDED(mu_);
275*cc02d7e2SAndroid Build Coastguard Worker   void UnrefAndWaitLocked() ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_);
276*cc02d7e2SAndroid Build Coastguard Worker 
277*cc02d7e2SAndroid Build Coastguard Worker   std::vector<std::shared_ptr<internal::ExternalConnectionAcceptorImpl>>
278*cc02d7e2SAndroid Build Coastguard Worker       acceptors_;
279*cc02d7e2SAndroid Build Coastguard Worker 
280*cc02d7e2SAndroid Build Coastguard Worker   // A vector of interceptor factory objects.
281*cc02d7e2SAndroid Build Coastguard Worker   // This should be destroyed after health_check_service_ and this requirement
282*cc02d7e2SAndroid Build Coastguard Worker   // is satisfied by declaring interceptor_creators_ before
283*cc02d7e2SAndroid Build Coastguard Worker   // health_check_service_. (C++ mandates that member objects be destroyed in
284*cc02d7e2SAndroid Build Coastguard Worker   // the reverse order of initialization.)
285*cc02d7e2SAndroid Build Coastguard Worker   std::vector<std::unique_ptr<experimental::ServerInterceptorFactoryInterface>>
286*cc02d7e2SAndroid Build Coastguard Worker       interceptor_creators_;
287*cc02d7e2SAndroid Build Coastguard Worker 
288*cc02d7e2SAndroid Build Coastguard Worker   int max_receive_message_size_;
289*cc02d7e2SAndroid Build Coastguard Worker 
290*cc02d7e2SAndroid Build Coastguard Worker   /// The following completion queues are ONLY used in case of Sync API
291*cc02d7e2SAndroid Build Coastguard Worker   /// i.e. if the server has any services with sync methods. The server uses
292*cc02d7e2SAndroid Build Coastguard Worker   /// these completion queues to poll for new RPCs
293*cc02d7e2SAndroid Build Coastguard Worker   std::shared_ptr<std::vector<std::unique_ptr<ServerCompletionQueue>>>
294*cc02d7e2SAndroid Build Coastguard Worker       sync_server_cqs_;
295*cc02d7e2SAndroid Build Coastguard Worker 
296*cc02d7e2SAndroid Build Coastguard Worker   /// List of \a ThreadManager instances (one for each cq in
297*cc02d7e2SAndroid Build Coastguard Worker   /// the \a sync_server_cqs)
298*cc02d7e2SAndroid Build Coastguard Worker   std::vector<std::unique_ptr<SyncRequestThreadManager>> sync_req_mgrs_;
299*cc02d7e2SAndroid Build Coastguard Worker 
300*cc02d7e2SAndroid Build Coastguard Worker   // Server status
301*cc02d7e2SAndroid Build Coastguard Worker   internal::Mutex mu_;
302*cc02d7e2SAndroid Build Coastguard Worker   bool started_;
303*cc02d7e2SAndroid Build Coastguard Worker   bool shutdown_ ABSL_GUARDED_BY(mu_);
304*cc02d7e2SAndroid Build Coastguard Worker   bool shutdown_notified_
305*cc02d7e2SAndroid Build Coastguard Worker       ABSL_GUARDED_BY(mu_);  // Was notify called on the shutdown_cv_
306*cc02d7e2SAndroid Build Coastguard Worker   internal::CondVar shutdown_done_cv_;
307*cc02d7e2SAndroid Build Coastguard Worker   bool shutdown_done_ ABSL_GUARDED_BY(mu_) = false;
308*cc02d7e2SAndroid Build Coastguard Worker   std::atomic_int shutdown_refs_outstanding_{1};
309*cc02d7e2SAndroid Build Coastguard Worker 
310*cc02d7e2SAndroid Build Coastguard Worker   internal::CondVar shutdown_cv_;
311*cc02d7e2SAndroid Build Coastguard Worker 
312*cc02d7e2SAndroid Build Coastguard Worker   std::shared_ptr<GlobalCallbacks> global_callbacks_;
313*cc02d7e2SAndroid Build Coastguard Worker 
314*cc02d7e2SAndroid Build Coastguard Worker   std::vector<std::string> services_;
315*cc02d7e2SAndroid Build Coastguard Worker   bool has_async_generic_service_ = false;
316*cc02d7e2SAndroid Build Coastguard Worker   bool has_callback_generic_service_ = false;
317*cc02d7e2SAndroid Build Coastguard Worker   bool has_callback_methods_ = false;
318*cc02d7e2SAndroid Build Coastguard Worker 
319*cc02d7e2SAndroid Build Coastguard Worker   // Pointer to the wrapped grpc_server.
320*cc02d7e2SAndroid Build Coastguard Worker   grpc_server* server_;
321*cc02d7e2SAndroid Build Coastguard Worker 
322*cc02d7e2SAndroid Build Coastguard Worker   std::unique_ptr<ServerInitializer> server_initializer_;
323*cc02d7e2SAndroid Build Coastguard Worker 
324*cc02d7e2SAndroid Build Coastguard Worker   std::unique_ptr<ContextAllocator> context_allocator_;
325*cc02d7e2SAndroid Build Coastguard Worker 
326*cc02d7e2SAndroid Build Coastguard Worker   std::unique_ptr<HealthCheckServiceInterface> health_check_service_;
327*cc02d7e2SAndroid Build Coastguard Worker   bool health_check_service_disabled_;
328*cc02d7e2SAndroid Build Coastguard Worker 
329*cc02d7e2SAndroid Build Coastguard Worker   // When appropriate, use a default callback generic service to handle
330*cc02d7e2SAndroid Build Coastguard Worker   // unimplemented methods
331*cc02d7e2SAndroid Build Coastguard Worker   std::unique_ptr<CallbackGenericService> unimplemented_service_;
332*cc02d7e2SAndroid Build Coastguard Worker 
333*cc02d7e2SAndroid Build Coastguard Worker   // A special handler for resource exhausted in sync case
334*cc02d7e2SAndroid Build Coastguard Worker   std::unique_ptr<internal::MethodHandler> resource_exhausted_handler_;
335*cc02d7e2SAndroid Build Coastguard Worker 
336*cc02d7e2SAndroid Build Coastguard Worker   // Handler for callback generic service, if any
337*cc02d7e2SAndroid Build Coastguard Worker   std::unique_ptr<internal::MethodHandler> generic_handler_;
338*cc02d7e2SAndroid Build Coastguard Worker 
339*cc02d7e2SAndroid Build Coastguard Worker   // callback_cq_ references the callbackable completion queue associated
340*cc02d7e2SAndroid Build Coastguard Worker   // with this server (if any). It is set on the first call to CallbackCQ().
341*cc02d7e2SAndroid Build Coastguard Worker   // It is _not owned_ by the server; ownership belongs with its internal
342*cc02d7e2SAndroid Build Coastguard Worker   // shutdown callback tag (invoked when the CQ is fully shutdown).
343*cc02d7e2SAndroid Build Coastguard Worker   std::atomic<CompletionQueue*> callback_cq_{nullptr};
344*cc02d7e2SAndroid Build Coastguard Worker 
345*cc02d7e2SAndroid Build Coastguard Worker   // List of CQs passed in by user that must be Shutdown only after Server is
346*cc02d7e2SAndroid Build Coastguard Worker   // Shutdown.  Even though this is only used with NDEBUG, instantiate it in all
347*cc02d7e2SAndroid Build Coastguard Worker   // cases since otherwise the size will be inconsistent.
348*cc02d7e2SAndroid Build Coastguard Worker   std::vector<CompletionQueue*> cq_list_;
349*cc02d7e2SAndroid Build Coastguard Worker 
350*cc02d7e2SAndroid Build Coastguard Worker   // Whetner per-call load reporting is enabled.
351*cc02d7e2SAndroid Build Coastguard Worker   bool call_metric_recording_enabled_ = false;
352*cc02d7e2SAndroid Build Coastguard Worker 
353*cc02d7e2SAndroid Build Coastguard Worker   // Interface to read or update server-wide metrics. Optional.
354*cc02d7e2SAndroid Build Coastguard Worker   experimental::ServerMetricRecorder* server_metric_recorder_ = nullptr;
355*cc02d7e2SAndroid Build Coastguard Worker };
356*cc02d7e2SAndroid Build Coastguard Worker 
357*cc02d7e2SAndroid Build Coastguard Worker }  // namespace grpc
358*cc02d7e2SAndroid Build Coastguard Worker 
359*cc02d7e2SAndroid Build Coastguard Worker #endif  // GRPCPP_SERVER_H
360