src/core/lib/surface/server.cc
Go to the documentation of this file.
1 //
2 // Copyright 2015-2016 gRPC authors.
3 //
4 // Licensed under the Apache License, Version 2.0 (the "License");
5 // you may not use this file except in compliance with the License.
6 // You may obtain a copy of the License at
7 //
8 // http://www.apache.org/licenses/LICENSE-2.0
9 //
10 // Unless required by applicable law or agreed to in writing, software
11 // distributed under the License is distributed on an "AS IS" BASIS,
12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 // See the License for the specific language governing permissions and
14 // limitations under the License.
15 //
16 
18 
20 
21 #include <inttypes.h>
22 #include <stdlib.h>
23 #include <string.h>
24 
25 #include <algorithm>
26 #include <atomic>
27 #include <list>
28 #include <new>
29 #include <queue>
30 #include <utility>
31 #include <vector>
32 
33 #include "absl/memory/memory.h"
34 #include "absl/status/status.h"
35 #include "absl/types/optional.h"
36 
37 #include <grpc/byte_buffer.h>
39 #include <grpc/status.h>
40 #include <grpc/support/log.h>
41 #include <grpc/support/time.h>
42 
63 
64 namespace grpc_core {
65 
66 TraceFlag grpc_server_channel_trace(false, "server_channel");
67 
68 //
69 // Server::RequestedCall
70 //
71 
73  enum class Type { BATCH_CALL, REGISTERED_CALL };
74 
75  RequestedCall(void* tag_arg, grpc_completion_queue* call_cq,
76  grpc_call** call_arg, grpc_metadata_array* initial_md,
78  : type(Type::BATCH_CALL),
79  tag(tag_arg),
80  cq_bound_to_call(call_cq),
81  call(call_arg),
82  initial_metadata(initial_md) {
83  details->reserved = nullptr;
84  data.batch.details = details;
85  }
86 
87  RequestedCall(void* tag_arg, grpc_completion_queue* call_cq,
88  grpc_call** call_arg, grpc_metadata_array* initial_md,
91  : type(Type::REGISTERED_CALL),
92  tag(tag_arg),
93  cq_bound_to_call(call_cq),
94  call(call_arg),
95  initial_metadata(initial_md) {
96  data.registered.method = rm;
97  data.registered.deadline = deadline;
98  data.registered.optional_payload = optional_payload;
99  }
100 
102  const Type type;
103  void* const tag;
105  grpc_call** const call;
108  union {
109  struct {
111  } batch;
112  struct {
116  } registered;
117  } data;
118 };
119 
120 //
121 // Server::RegisteredMethod
122 //
123 
126  const char* method_arg, const char* host_arg,
128  uint32_t flags_arg)
129  : method(method_arg == nullptr ? "" : method_arg),
130  host(host_arg == nullptr ? "" : host_arg),
131  payload_handling(payload_handling_arg),
132  flags(flags_arg) {}
133 
134  ~RegisteredMethod() = default;
135 
140  // One request matcher per method.
141  std::unique_ptr<RequestMatcherInterface> matcher;
142 };
143 
144 //
145 // Server::RequestMatcherInterface
146 //
147 
148 // RPCs that come in from the transport must be matched against RPC requests
149 // from the application. An incoming request from the application can be matched
150 // to an RPC that has already arrived or can be queued up for later use.
151 // Likewise, an RPC coming in from the transport can either be matched to a
152 // request that already arrived from the application or can be queued up for
153 // later use (marked pending). If there is a match, the request's tag is posted
154 // on the request's notification CQ.
155 //
156 // RequestMatcherInterface is the base class to provide this functionality.
158  public:
160 
161  // Unref the calls associated with any incoming RPCs in the pending queue (not
162  // yet matched to an application-requested RPC).
163  virtual void ZombifyPending() = 0;
164 
165  // Mark all application-requested RPCs failed if they have not been matched to
166  // an incoming RPC. The error parameter indicates why the RPCs are being
167  // failed (always server shutdown in all current implementations).
168  virtual void KillRequests(grpc_error_handle error) = 0;
169 
170  // How many request queues are supported by this matcher. This is an abstract
171  // concept that essentially maps to gRPC completion queues.
172  virtual size_t request_queue_count() const = 0;
173 
174  // This function is invoked when the application requests a new RPC whose
175  // information is in the call parameter. The request_queue_index marks the
176  // queue onto which to place this RPC, and is typically associated with a gRPC
177  // CQ. If there are pending RPCs waiting to be matched, publish one (match it
178  // and notify the CQ).
179  virtual void RequestCallWithPossiblePublish(size_t request_queue_index,
180  RequestedCall* call) = 0;
181 
182  // This function is invoked on an incoming RPC, represented by the calld
183  // object. The RequestMatcher will try to match it against an
184  // application-requested RPC if possible or will place it in the pending queue
185  // otherwise. To enable some measure of fairness between server CQs, the match
186  // is done starting at the start_request_queue_index parameter in a cyclic
187  // order rather than always starting at 0.
188  virtual void MatchOrQueue(size_t start_request_queue_index,
189  CallData* calld) = 0;
190 
191  // Returns the server associated with this request matcher
192  virtual Server* server() const = 0;
193 };
194 
195 // The RealRequestMatcher is an implementation of RequestMatcherInterface that
196 // actually uses all the features of RequestMatcherInterface: expecting the
197 // application to explicitly request RPCs and then matching those to incoming
198 // RPCs, along with a slow path by which incoming RPCs are put on a locked
199 // pending list if they aren't able to be matched to an application request.
201  public:
204 
205  ~RealRequestMatcher() override {
206  for (LockedMultiProducerSingleConsumerQueue& queue : requests_per_cq_) {
207  GPR_ASSERT(queue.Pop() == nullptr);
208  }
209  }
210 
211  void ZombifyPending() override {
212  while (!pending_.empty()) {
213  CallData* calld = pending_.front();
214  calld->SetState(CallData::CallState::ZOMBIED);
215  calld->KillZombie();
216  pending_.pop();
217  }
218  }
219 
221  for (size_t i = 0; i < requests_per_cq_.size(); i++) {
222  RequestedCall* rc;
223  while ((rc = reinterpret_cast<RequestedCall*>(
224  requests_per_cq_[i].Pop())) != nullptr) {
225  server_->FailCall(i, rc, GRPC_ERROR_REF(error));
226  }
227  }
229  }
230 
231  size_t request_queue_count() const override {
232  return requests_per_cq_.size();
233  }
234 
235  void RequestCallWithPossiblePublish(size_t request_queue_index,
236  RequestedCall* call) override {
237  if (requests_per_cq_[request_queue_index].Push(&call->mpscq_node)) {
238  /* this was the first queued request: we need to lock and start
239  matching calls */
240  struct PendingCall {
241  RequestedCall* rc = nullptr;
242  CallData* calld;
243  };
244  auto pop_next_pending = [this, request_queue_index] {
245  PendingCall pending_call;
246  {
247  MutexLock lock(&server_->mu_call_);
248  if (!pending_.empty()) {
249  pending_call.rc = reinterpret_cast<RequestedCall*>(
250  requests_per_cq_[request_queue_index].Pop());
251  if (pending_call.rc != nullptr) {
252  pending_call.calld = pending_.front();
253  pending_.pop();
254  }
255  }
256  }
257  return pending_call;
258  };
259  while (true) {
260  PendingCall next_pending = pop_next_pending();
261  if (next_pending.rc == nullptr) break;
262  if (!next_pending.calld->MaybeActivate()) {
263  // Zombied Call
264  next_pending.calld->KillZombie();
265  } else {
266  next_pending.calld->Publish(request_queue_index, next_pending.rc);
267  }
268  }
269  }
270  }
271 
272  void MatchOrQueue(size_t start_request_queue_index,
273  CallData* calld) override {
274  for (size_t i = 0; i < requests_per_cq_.size(); i++) {
275  size_t cq_idx = (start_request_queue_index + i) % requests_per_cq_.size();
276  RequestedCall* rc =
277  reinterpret_cast<RequestedCall*>(requests_per_cq_[cq_idx].TryPop());
278  if (rc != nullptr) {
280  calld->SetState(CallData::CallState::ACTIVATED);
281  calld->Publish(cq_idx, rc);
282  return;
283  }
284  }
285  // No cq to take the request found; queue it on the slow list.
287  // We need to ensure that all the queues are empty. We do this under
288  // the server mu_call_ lock to ensure that if something is added to
289  // an empty request queue, it will block until the call is actually
290  // added to the pending list.
291  RequestedCall* rc = nullptr;
292  size_t cq_idx = 0;
293  size_t loop_count;
294  {
295  MutexLock lock(&server_->mu_call_);
296  for (loop_count = 0; loop_count < requests_per_cq_.size(); loop_count++) {
297  cq_idx =
298  (start_request_queue_index + loop_count) % requests_per_cq_.size();
299  rc = reinterpret_cast<RequestedCall*>(requests_per_cq_[cq_idx].Pop());
300  if (rc != nullptr) {
301  break;
302  }
303  }
304  if (rc == nullptr) {
305  calld->SetState(CallData::CallState::PENDING);
306  pending_.push(calld);
307  return;
308  }
309  }
311  calld->SetState(CallData::CallState::ACTIVATED);
312  calld->Publish(cq_idx, rc);
313  }
314 
315  Server* server() const override { return server_; }
316 
317  private:
318  Server* const server_;
319  std::queue<CallData*> pending_;
320  std::vector<LockedMultiProducerSingleConsumerQueue> requests_per_cq_;
321 };
322 
323 // AllocatingRequestMatchers don't allow the application to request an RPC in
324 // advance or queue up any incoming RPC for later match. Instead, MatchOrQueue
325 // will call out to an allocation function passed in at the construction of the
326 // object. These request matchers are designed for the C++ callback API, so they
327 // only support 1 completion queue (passed in at the constructor). They are also
328 // used for the sync API.
330  public:
332  : server_(server), cq_(cq) {
333  size_t idx;
334  for (idx = 0; idx < server->cqs_.size(); idx++) {
335  if (server->cqs_[idx] == cq) {
336  break;
337  }
338  }
339  GPR_ASSERT(idx < server->cqs_.size());
340  cq_idx_ = idx;
341  }
342 
343  void ZombifyPending() override {}
344 
347  }
348 
349  size_t request_queue_count() const override { return 0; }
350 
351  void RequestCallWithPossiblePublish(size_t /*request_queue_index*/,
352  RequestedCall* /*call*/) final {
353  GPR_ASSERT(false);
354  }
355 
356  Server* server() const override { return server_; }
357 
358  // Supply the completion queue related to this request matcher
359  grpc_completion_queue* cq() const { return cq_; }
360 
361  // Supply the completion queue's index relative to the server.
362  size_t cq_idx() const { return cq_idx_; }
363 
364  private:
365  Server* const server_;
367  size_t cq_idx_;
368 };
369 
370 // An allocating request matcher for non-registered methods (used for generic
371 // API and unimplemented RPCs).
374  public:
376  std::function<BatchCallAllocation()> allocator)
378  allocator_(std::move(allocator)) {}
379 
380  void MatchOrQueue(size_t /*start_request_queue_index*/,
381  CallData* calld) override {
382  if (server()->ShutdownRefOnRequest()) {
383  BatchCallAllocation call_info = allocator_();
385  cq(), static_cast<void*>(call_info.tag), nullptr,
386  nullptr) == GRPC_CALL_OK);
387  RequestedCall* rc = new RequestedCall(
388  static_cast<void*>(call_info.tag), call_info.cq, call_info.call,
389  call_info.initial_metadata, call_info.details);
390  calld->SetState(CallData::CallState::ACTIVATED);
391  calld->Publish(cq_idx(), rc);
392  } else {
393  calld->FailCallCreation();
394  }
395  server()->ShutdownUnrefOnRequest();
396  }
397 
398  private:
399  std::function<BatchCallAllocation()> allocator_;
400 };
401 
402 // An allocating request matcher for registered methods.
405  public:
408  std::function<RegisteredCallAllocation()> allocator)
411  allocator_(std::move(allocator)) {}
412 
413  void MatchOrQueue(size_t /*start_request_queue_index*/,
414  CallData* calld) override {
415  if (server()->ShutdownRefOnRequest()) {
416  RegisteredCallAllocation call_info = allocator_();
418  cq(), call_info.tag, call_info.optional_payload,
420  RequestedCall* rc =
421  new RequestedCall(call_info.tag, call_info.cq, call_info.call,
422  call_info.initial_metadata, registered_method_,
423  call_info.deadline, call_info.optional_payload);
424  calld->SetState(CallData::CallState::ACTIVATED);
425  calld->Publish(cq_idx(), rc);
426  } else {
427  calld->FailCallCreation();
428  }
429  server()->ShutdownUnrefOnRequest();
430  }
431 
432  private:
434  std::function<RegisteredCallAllocation()> allocator_;
435 };
436 
437 //
438 // ChannelBroadcaster
439 //
440 
441 namespace {
442 
443 class ChannelBroadcaster {
444  public:
445  // This can have an empty constructor and destructor since we want to control
446  // when the actual setup and shutdown broadcast take place.
447 
448  // Copies over the channels from the locked server.
449  void FillChannelsLocked(std::vector<RefCountedPtr<Channel>> channels) {
450  GPR_DEBUG_ASSERT(channels_.empty());
451  channels_ = std::move(channels);
452  }
453 
454  // Broadcasts a shutdown on each channel.
455  void BroadcastShutdown(bool send_goaway, grpc_error_handle force_disconnect) {
456  for (const RefCountedPtr<Channel>& channel : channels_) {
457  SendShutdown(channel->c_ptr(), send_goaway,
458  GRPC_ERROR_REF(force_disconnect));
459  }
460  channels_.clear(); // just for safety against double broadcast
461  GRPC_ERROR_UNREF(force_disconnect);
462  }
463 
464  private:
465  struct ShutdownCleanupArgs {
468  };
469 
470  static void ShutdownCleanup(void* arg, grpc_error_handle /*error*/) {
471  ShutdownCleanupArgs* a = static_cast<ShutdownCleanupArgs*>(arg);
473  delete a;
474  }
475 
476  static void SendShutdown(grpc_channel* channel, bool send_goaway,
477  grpc_error_handle send_disconnect) {
478  ShutdownCleanupArgs* sc = new ShutdownCleanupArgs;
479  GRPC_CLOSURE_INIT(&sc->closure, ShutdownCleanup, sc,
480  grpc_schedule_on_exec_ctx);
483  op->goaway_error =
486  GRPC_ERROR_CREATE_FROM_STATIC_STRING("Server shutdown"),
488  : GRPC_ERROR_NONE;
489  sc->slice = grpc_slice_from_copied_string("Server shutdown");
490  op->disconnect_with_error = send_disconnect;
491  elem =
493  elem->filter->start_transport_op(elem, op);
494  }
495 
496  std::vector<RefCountedPtr<Channel>> channels_;
497 };
498 
499 } // namespace
500 
501 //
502 // Server
503 //
504 
507  nullptr,
509  sizeof(Server::CallData),
513  sizeof(Server::ChannelData),
518  "server",
519 };
520 
521 namespace {
522 
523 RefCountedPtr<channelz::ServerNode> CreateChannelzNode(ChannelArgs args) {
524  RefCountedPtr<channelz::ServerNode> channelz_node;
525  if (args.GetBool(GRPC_ARG_ENABLE_CHANNELZ)
526  .value_or(GRPC_ENABLE_CHANNELZ_DEFAULT)) {
527  size_t channel_tracer_max_memory = std::max(
530  channelz_node =
531  MakeRefCounted<channelz::ServerNode>(channel_tracer_max_memory);
532  channelz_node->AddTraceEvent(
533  channelz::ChannelTrace::Severity::Info,
534  grpc_slice_from_static_string("Server created"));
535  }
536  return channelz_node;
537 }
538 
539 } // namespace
540 
542  : channel_args_(args.ToC()), channelz_node_(CreateChannelzNode(args)) {}
543 
546  // Remove the cq pollsets from the config_fetcher.
547  if (started_ && config_fetcher_ != nullptr &&
548  config_fetcher_->interested_parties() != nullptr) {
549  for (grpc_pollset* pollset : pollsets_) {
550  grpc_pollset_set_del_pollset(config_fetcher_->interested_parties(),
551  pollset);
552  }
553  }
554  for (size_t i = 0; i < cqs_.size(); i++) {
555  GRPC_CQ_INTERNAL_UNREF(cqs_[i], "server");
556  }
557 }
558 
560  channelz::ListenSocketNode* listen_socket_node =
561  listener->channelz_listen_socket_node();
562  if (listen_socket_node != nullptr && channelz_node_ != nullptr) {
563  channelz_node_->AddChildListenSocket(listen_socket_node->Ref());
564  }
565  listeners_.emplace_back(std::move(listener));
566 }
567 
569  started_ = true;
570  for (grpc_completion_queue* cq : cqs_) {
571  if (grpc_cq_can_listen(cq)) {
572  pollsets_.push_back(grpc_cq_pollset(cq));
573  }
574  }
575  if (unregistered_request_matcher_ == nullptr) {
576  unregistered_request_matcher_ = absl::make_unique<RealRequestMatcher>(this);
577  }
578  for (std::unique_ptr<RegisteredMethod>& rm : registered_methods_) {
579  if (rm->matcher == nullptr) {
580  rm->matcher = absl::make_unique<RealRequestMatcher>(this);
581  }
582  }
583  {
584  MutexLock lock(&mu_global_);
585  starting_ = true;
586  }
587  // Register the interested parties from the config fetcher to the cq pollsets
588  // before starting listeners so that config fetcher is being polled when the
589  // listeners start watch the fetcher.
590  if (config_fetcher_ != nullptr &&
591  config_fetcher_->interested_parties() != nullptr) {
592  for (grpc_pollset* pollset : pollsets_) {
593  grpc_pollset_set_add_pollset(config_fetcher_->interested_parties(),
594  pollset);
595  }
596  }
597  for (auto& listener : listeners_) {
598  listener.listener->Start(this, &pollsets_);
599  }
600  MutexLock lock(&mu_global_);
601  starting_ = false;
603 }
604 
606  grpc_transport* transport, grpc_pollset* accepting_pollset,
607  const grpc_channel_args* args,
608  const RefCountedPtr<channelz::SocketNode>& socket_node) {
609  // Create channel.
612  if (!channel.ok()) {
613  return absl_status_to_grpc_error(channel.status());
614  }
615  ChannelData* chand = static_cast<ChannelData*>(
616  grpc_channel_stack_element((*channel)->channel_stack(), 0)->channel_data);
617  // Set up CQs.
618  size_t cq_idx;
619  for (cq_idx = 0; cq_idx < cqs_.size(); cq_idx++) {
620  if (grpc_cq_pollset(cqs_[cq_idx]) == accepting_pollset) break;
621  }
622  if (cq_idx == cqs_.size()) {
623  // Completion queue not found. Pick a random one to publish new calls to.
624  cq_idx = static_cast<size_t>(rand()) % cqs_.size();
625  }
626  // Set up channelz node.
627  intptr_t channelz_socket_uuid = 0;
628  if (socket_node != nullptr) {
629  channelz_socket_uuid = socket_node->uuid();
630  channelz_node_->AddChildSocket(socket_node);
631  }
632  // Initialize chand.
633  chand->InitTransport(Ref(), std::move(*channel), cq_idx, transport,
634  channelz_socket_uuid);
635  return GRPC_ERROR_NONE;
636 }
637 
639  MutexLock lock(&mu_global_);
640  return !channels_.empty();
641 }
642 
644  grpc_completion_queue* cq, void* method_tag,
646  RegisteredMethod* rm = static_cast<RegisteredMethod*>(method_tag);
647  rm->matcher = absl::make_unique<AllocatingRequestMatcherRegistered>(
648  this, cq, rm, std::move(allocator));
649 }
650 
655  absl::make_unique<AllocatingRequestMatcherBatch>(this, cq,
656  std::move(allocator));
657 }
658 
660  for (grpc_completion_queue* queue : cqs_) {
661  if (queue == cq) return;
662  }
663  GRPC_CQ_INTERNAL_REF(cq, "server");
664  cqs_.push_back(cq);
665 }
666 
667 namespace {
668 
669 bool streq(const std::string& a, const char* b) {
670  return (a.empty() && b == nullptr) ||
671  ((b != nullptr) && !strcmp(a.c_str(), b));
672 }
673 
674 } // namespace
675 
676 Server::RegisteredMethod* Server::RegisterMethod(
677  const char* method, const char* host,
679  uint32_t flags) {
680  if (!method) {
682  "grpc_server_register_method method string cannot be NULL");
683  return nullptr;
684  }
685  for (std::unique_ptr<RegisteredMethod>& m : registered_methods_) {
686  if (streq(m->method, method) && streq(m->host, host)) {
687  gpr_log(GPR_ERROR, "duplicate registration for %s@%s", method,
688  host ? host : "*");
689  return nullptr;
690  }
691  }
692  if (flags != 0) {
693  gpr_log(GPR_ERROR, "grpc_server_register_method invalid flags 0x%08x",
694  flags);
695  return nullptr;
696  }
697  registered_methods_.emplace_back(absl::make_unique<RegisteredMethod>(
698  method, host, payload_handling, flags));
699  return registered_methods_.back().get();
700 }
701 
703  delete static_cast<RequestedCall*>(req);
704 }
705 
706 void Server::FailCall(size_t cq_idx, RequestedCall* rc,
708  *rc->call = nullptr;
709  rc->initial_metadata->count = 0;
711  grpc_cq_end_op(cqs_[cq_idx], rc->tag, error, DoneRequestEvent, rc,
712  &rc->completion);
713 }
714 
715 // Before calling MaybeFinishShutdown(), we must hold mu_global_ and not
716 // hold mu_call_.
718  if (!ShutdownReady() || shutdown_published_) {
719  return;
720  }
721  {
722  MutexLock lock(&mu_call_);
724  GRPC_ERROR_CREATE_FROM_STATIC_STRING("Server Shutdown"));
725  }
726  if (!channels_.empty() || listeners_destroyed_ < listeners_.size()) {
732  "Waiting for %" PRIuPTR " channels and %" PRIuPTR "/%" PRIuPTR
733  " listeners to be destroyed before shutting down server",
734  channels_.size(), listeners_.size() - listeners_destroyed_,
735  listeners_.size());
736  }
737  return;
738  }
739  shutdown_published_ = true;
740  for (auto& shutdown_tag : shutdown_tags_) {
741  Ref().release();
742  grpc_cq_end_op(shutdown_tag.cq, shutdown_tag.tag, GRPC_ERROR_NONE,
743  DoneShutdownEvent, this, &shutdown_tag.completion);
744  }
745 }
746 
748  if (started_) {
750  unregistered_request_matcher_->ZombifyPending();
751  for (std::unique_ptr<RegisteredMethod>& rm : registered_methods_) {
752  rm->matcher->KillRequests(GRPC_ERROR_REF(error));
753  rm->matcher->ZombifyPending();
754  }
755  }
757 }
758 
759 std::vector<RefCountedPtr<Channel>> Server::GetChannelsLocked() const {
760  std::vector<RefCountedPtr<Channel>> channels;
761  channels.reserve(channels_.size());
762  for (const ChannelData* chand : channels_) {
763  channels.push_back(chand->channel()->Ref());
764  }
765  return channels;
766 }
767 
769  Server* server = static_cast<Server*>(arg);
770  MutexLock lock(&server->mu_global_);
771  server->listeners_destroyed_++;
772  server->MaybeFinishShutdown();
773 }
774 
775 namespace {
776 
777 void DonePublishedShutdown(void* /*done_arg*/, grpc_cq_completion* storage) {
778  delete storage;
779 }
780 
781 } // namespace
782 
783 // - Kills all pending requests-for-incoming-RPC-calls (i.e., the requests made
784 // via grpc_server_request_call() and grpc_server_request_registered_call()
785 // will now be cancelled). See KillPendingWorkLocked().
786 //
787 // - Shuts down the listeners (i.e., the server will no longer listen on the
788 // port for new incoming channels).
789 //
790 // - Iterates through all channels on the server and sends shutdown msg (see
791 // ChannelBroadcaster::BroadcastShutdown() for details) to the clients via
792 // the transport layer. The transport layer then guarantees the following:
793 // -- Sends shutdown to the client (e.g., HTTP2 transport sends GOAWAY).
794 // -- If the server has outstanding calls that are in the process, the
795 // connection is NOT closed until the server is done with all those calls.
796 // -- Once there are no more calls in progress, the channel is closed.
798  absl::Notification* await_requests = nullptr;
799  ChannelBroadcaster broadcaster;
800  {
801  // Wait for startup to be finished. Locks mu_global.
802  MutexLock lock(&mu_global_);
803  while (starting_) {
805  }
806  // Stay locked, and gather up some stuff to do.
808  if (shutdown_published_) {
809  grpc_cq_end_op(cq, tag, GRPC_ERROR_NONE, DonePublishedShutdown, nullptr,
810  new grpc_cq_completion);
811  return;
812  }
813  shutdown_tags_.emplace_back(tag, cq);
814  if (ShutdownCalled()) {
815  return;
816  }
818  broadcaster.FillChannelsLocked(GetChannelsLocked());
819  // Collect all unregistered then registered calls.
820  {
821  MutexLock lock(&mu_call_);
823  GRPC_ERROR_CREATE_FROM_STATIC_STRING("Server Shutdown"));
824  }
825  await_requests = ShutdownUnrefOnShutdownCall();
826  }
827  // We expect no new requests but there can still be requests in-flight.
828  // Wait for them to complete before proceeding.
829  if (await_requests != nullptr) {
830  await_requests->WaitForNotification();
831  }
832  StopListening();
833  broadcaster.BroadcastShutdown(/*send_goaway=*/true, GRPC_ERROR_NONE);
834 }
835 
837  for (auto& listener : listeners_) {
838  if (listener.listener == nullptr) continue;
839  channelz::ListenSocketNode* channelz_listen_socket_node =
840  listener.listener->channelz_listen_socket_node();
841  if (channelz_node_ != nullptr && channelz_listen_socket_node != nullptr) {
842  channelz_node_->RemoveChildListenSocket(
843  channelz_listen_socket_node->uuid());
844  }
845  GRPC_CLOSURE_INIT(&listener.destroy_done, ListenerDestroyDone, this,
846  grpc_schedule_on_exec_ctx);
847  listener.listener->SetOnDestroyDone(&listener.destroy_done);
848  listener.listener.reset();
849  }
850 }
851 
853  ChannelBroadcaster broadcaster;
854  {
855  MutexLock lock(&mu_global_);
856  broadcaster.FillChannelsLocked(GetChannelsLocked());
857  }
858  broadcaster.BroadcastShutdown(
859  /*send_goaway=*/false,
860  GRPC_ERROR_CREATE_FROM_STATIC_STRING("Cancelling all calls"));
861 }
862 
864  ChannelBroadcaster broadcaster;
865  {
866  MutexLock lock(&mu_global_);
867  broadcaster.FillChannelsLocked(GetChannelsLocked());
868  }
869  broadcaster.BroadcastShutdown(/*send_goaway=*/true, GRPC_ERROR_NONE);
870 }
871 
873  {
874  MutexLock lock(&mu_global_);
875  GPR_ASSERT(ShutdownCalled() || listeners_.empty());
877  }
878  Unref();
879 }
880 
882  grpc_completion_queue* cq_for_notification, void* tag,
883  grpc_byte_buffer** optional_payload, RegisteredMethod* rm) {
884  if ((rm == nullptr && optional_payload != nullptr) ||
885  ((rm != nullptr) && ((optional_payload == nullptr) !=
886  (rm->payload_handling == GRPC_SRM_PAYLOAD_NONE)))) {
888  }
889  if (!grpc_cq_begin_op(cq_for_notification, tag)) {
891  }
892  return GRPC_CALL_OK;
893 }
894 
896  size_t* cq_idx, grpc_completion_queue* cq_for_notification, void* tag,
897  grpc_byte_buffer** optional_payload, RegisteredMethod* rm) {
898  size_t idx;
899  for (idx = 0; idx < cqs_.size(); idx++) {
900  if (cqs_[idx] == cq_for_notification) {
901  break;
902  }
903  }
904  if (idx == cqs_.size()) {
906  }
908  ValidateServerRequest(cq_for_notification, tag, optional_payload, rm);
909  if (error != GRPC_CALL_OK) {
910  return error;
911  }
912  *cq_idx = idx;
913  return GRPC_CALL_OK;
914 }
915 
916 grpc_call_error Server::QueueRequestedCall(size_t cq_idx, RequestedCall* rc) {
917  if (ShutdownCalled()) {
918  FailCall(cq_idx, rc,
919  GRPC_ERROR_CREATE_FROM_STATIC_STRING("Server Shutdown"));
920  return GRPC_CALL_OK;
921  }
922  RequestMatcherInterface* rm;
923  switch (rc->type) {
924  case RequestedCall::Type::BATCH_CALL:
926  break;
927  case RequestedCall::Type::REGISTERED_CALL:
928  rm = rc->data.registered.method->matcher.get();
929  break;
930  }
931  rm->RequestCallWithPossiblePublish(cq_idx, rc);
932  return GRPC_CALL_OK;
933 }
934 
937  grpc_metadata_array* request_metadata,
938  grpc_completion_queue* cq_bound_to_call,
939  grpc_completion_queue* cq_for_notification,
940  void* tag) {
941  size_t cq_idx;
943  &cq_idx, cq_for_notification, tag, nullptr, nullptr);
944  if (error != GRPC_CALL_OK) {
945  return error;
946  }
947  RequestedCall* rc =
948  new RequestedCall(tag, cq_bound_to_call, call, request_metadata, details);
949  return QueueRequestedCall(cq_idx, rc);
950 }
951 
953  RegisteredMethod* rm, grpc_call** call, gpr_timespec* deadline,
954  grpc_metadata_array* request_metadata, grpc_byte_buffer** optional_payload,
955  grpc_completion_queue* cq_bound_to_call,
956  grpc_completion_queue* cq_for_notification, void* tag_new) {
957  size_t cq_idx;
959  &cq_idx, cq_for_notification, tag_new, optional_payload, rm);
960  if (error != GRPC_CALL_OK) {
961  return error;
962  }
963  RequestedCall* rc =
964  new RequestedCall(tag_new, cq_bound_to_call, call, request_metadata, rm,
965  deadline, optional_payload);
966  return QueueRequestedCall(cq_idx, rc);
967 }
968 
969 //
970 // Server::ChannelData::ConnectivityWatcher
971 //
972 
973 class Server::ChannelData::ConnectivityWatcher
974  : public AsyncConnectivityStateWatcherInterface {
975  public:
977  : chand_(chand), channel_(chand_->channel_->Ref()) {}
978 
979  private:
981  const absl::Status& /*status*/) override {
982  // Don't do anything until we are being shut down.
983  if (new_state != GRPC_CHANNEL_SHUTDOWN) return;
984  // Shut down channel.
985  MutexLock lock(&chand_->server_->mu_global_);
986  chand_->Destroy();
987  }
988 
990  const RefCountedPtr<Channel> channel_;
991 };
992 
993 //
994 // Server::ChannelData
995 //
996 
998  registered_methods_.reset();
999  if (server_ != nullptr) {
1000  if (server_->channelz_node_ != nullptr && channelz_socket_uuid_ != 0) {
1001  server_->channelz_node_->RemoveChildSocket(channelz_socket_uuid_);
1002  }
1003  {
1004  MutexLock lock(&server_->mu_global_);
1005  if (list_position_.has_value()) {
1006  server_->channels_.erase(*list_position_);
1007  list_position_.reset();
1008  }
1009  server_->MaybeFinishShutdown();
1010  }
1011  }
1012 }
1013 
1016  size_t cq_idx,
1018  intptr_t channelz_socket_uuid) {
1020  channel_ = channel;
1021  cq_idx_ = cq_idx;
1022  channelz_socket_uuid_ = channelz_socket_uuid;
1023  // Build a lookup table phrased in terms of mdstr's in this channels context
1024  // to quickly find registered methods.
1025  size_t num_registered_methods = server_->registered_methods_.size();
1026  if (num_registered_methods > 0) {
1027  uint32_t max_probes = 0;
1028  size_t slots = 2 * num_registered_methods;
1030  absl::make_unique<std::vector<ChannelRegisteredMethod>>(slots);
1031  for (std::unique_ptr<RegisteredMethod>& rm : server_->registered_methods_) {
1032  Slice host;
1034  const bool has_host = !rm->host.empty();
1035  if (has_host) {
1036  host = Slice::FromExternalString(rm->host.c_str());
1037  }
1038  uint32_t hash = MixHash32(has_host ? host.Hash() : 0, method.Hash());
1039  uint32_t probes = 0;
1040  for (probes = 0; (*registered_methods_)[(hash + probes) % slots]
1041  .server_registered_method != nullptr;
1042  probes++) {
1043  }
1044  if (probes > max_probes) max_probes = probes;
1046  &(*registered_methods_)[(hash + probes) % slots];
1047  crm->server_registered_method = rm.get();
1048  crm->flags = rm->flags;
1049  crm->has_host = has_host;
1050  if (has_host) {
1051  crm->host = std::move(host);
1052  }
1053  crm->method = std::move(method);
1054  }
1055  GPR_ASSERT(slots <= UINT32_MAX);
1056  registered_method_max_probes_ = max_probes;
1057  }
1058  // Publish channel.
1059  {
1060  MutexLock lock(&server_->mu_global_);
1061  server_->channels_.push_front(this);
1062  list_position_ = server_->channels_.begin();
1063  }
1064  // Start accept_stream transport op.
1066  op->set_accept_stream = true;
1067  op->set_accept_stream_fn = AcceptStream;
1068  op->set_accept_stream_user_data = this;
1069  op->start_connectivity_watch = MakeOrphanable<ConnectivityWatcher>(this);
1070  if (server_->ShutdownCalled()) {
1071  op->disconnect_with_error =
1072  GRPC_ERROR_CREATE_FROM_STATIC_STRING("Server shutdown");
1073  }
1075 }
1076 
1078  const grpc_slice& host, const grpc_slice& path) {
1079  if (registered_methods_ == nullptr) return nullptr;
1080  /* TODO(ctiller): unify these two searches */
1081  /* check for an exact match with host */
1082  uint32_t hash =
1084  for (size_t i = 0; i <= registered_method_max_probes_; i++) {
1086  &(*registered_methods_)[(hash + i) % registered_methods_->size()];
1087  if (rm->server_registered_method == nullptr) break;
1088  if (!rm->has_host) continue;
1089  if (rm->host != host) continue;
1090  if (rm->method != path) continue;
1091  return rm;
1092  }
1093  /* check for a wildcard method definition (no host set) */
1095  for (size_t i = 0; i <= registered_method_max_probes_; i++) {
1097  &(*registered_methods_)[(hash + i) % registered_methods_->size()];
1098  if (rm->server_registered_method == nullptr) break;
1099  if (rm->has_host) continue;
1100  if (rm->method != path) continue;
1101  return rm;
1102  }
1103  return nullptr;
1104 }
1105 
1107  const void* transport_server_data) {
1108  auto* chand = static_cast<Server::ChannelData*>(arg);
1109  /* create a call */
1111  args.channel = chand->channel_;
1112  args.server = chand->server_.get();
1113  args.parent = nullptr;
1114  args.propagation_mask = 0;
1115  args.cq = nullptr;
1116  args.pollset_set_alternative = nullptr;
1117  args.server_transport_data = transport_server_data;
1118  args.send_deadline = Timestamp::InfFuture();
1119  grpc_call* call;
1123  auto* calld = static_cast<Server::CallData*>(elem->call_data);
1124  if (!GRPC_ERROR_IS_NONE(error)) {
1126  calld->FailCallCreation();
1127  return;
1128  }
1129  calld->Start(elem);
1130 }
1131 
1133  grpc_error_handle /*error*/) {
1134  auto* chand = static_cast<Server::ChannelData*>(arg);
1135  Server* server = chand->server_.get();
1136  auto* channel_stack = chand->channel_->channel_stack();
1137  chand->channel_.reset();
1138  server->Unref();
1139  GRPC_CHANNEL_STACK_UNREF(channel_stack, "Server::ChannelData::Destroy");
1140 }
1141 
1143  if (!list_position_.has_value()) return;
1144  GPR_ASSERT(server_ != nullptr);
1145  server_->channels_.erase(*list_position_);
1146  list_position_.reset();
1147  server_->Ref().release();
1148  server_->MaybeFinishShutdown();
1149  // Unreffed by FinishDestroy
1150  GRPC_CHANNEL_STACK_REF(channel_->channel_stack(),
1151  "Server::ChannelData::Destroy");
1152  GRPC_CLOSURE_INIT(&finish_destroy_channel_closure_, FinishDestroy, this,
1153  grpc_schedule_on_exec_ctx);
1155  gpr_log(GPR_INFO, "Disconnected client");
1156  }
1158  grpc_make_transport_op(&finish_destroy_channel_closure_);
1159  op->set_accept_stream = true;
1161  op);
1162 }
1163 
1166  GPR_ASSERT(args->is_first);
1167  GPR_ASSERT(!args->is_last);
1168  new (elem->channel_data) ChannelData();
1169  return GRPC_ERROR_NONE;
1170 }
1171 
1173  auto* chand = static_cast<ChannelData*>(elem->channel_data);
1174  chand->~ChannelData();
1175 }
1176 
1177 //
1178 // Server::CallData
1179 //
1180 
1184  : server_(std::move(server)),
1186  call_combiner_(args.call_combiner) {
1188  elem, grpc_schedule_on_exec_ctx);
1190  elem, grpc_schedule_on_exec_ctx);
1191 }
1192 
1194  GPR_ASSERT(state_.load(std::memory_order_relaxed) != CallState::PENDING);
1196  grpc_metadata_array_destroy(&initial_metadata_);
1197  grpc_byte_buffer_destroy(payload_);
1198 }
1199 
1201  state_.store(state, std::memory_order_relaxed);
1202 }
1203 
1205  CallState expected = CallState::PENDING;
1206  return state_.compare_exchange_strong(expected, CallState::ACTIVATED,
1207  std::memory_order_acq_rel,
1208  std::memory_order_relaxed);
1209 }
1210 
1212  CallState expected_not_started = CallState::NOT_STARTED;
1213  CallState expected_pending = CallState::PENDING;
1214  if (state_.compare_exchange_strong(expected_not_started, CallState::ZOMBIED,
1215  std::memory_order_acq_rel,
1216  std::memory_order_acquire)) {
1217  KillZombie();
1218  } else if (state_.compare_exchange_strong(
1219  expected_pending, CallState::ZOMBIED,
1220  std::memory_order_acq_rel, std::memory_order_relaxed)) {
1221  // Zombied call will be destroyed when it's removed from the pending
1222  // queue... later.
1223  }
1224 }
1225 
1227  grpc_op op;
1229  op.flags = 0;
1230  op.reserved = nullptr;
1231  op.data.recv_initial_metadata.recv_initial_metadata = &initial_metadata_;
1232  GRPC_CLOSURE_INIT(&recv_initial_metadata_batch_complete_,
1233  RecvInitialMetadataBatchComplete, elem,
1234  grpc_schedule_on_exec_ctx);
1236  &recv_initial_metadata_batch_complete_);
1237 }
1238 
1239 void Server::CallData::Publish(size_t cq_idx, RequestedCall* rc) {
1240  grpc_call_set_completion_queue(call_, rc->cq_bound_to_call);
1241  *rc->call = call_;
1242  cq_new_ = server_->cqs_[cq_idx];
1243  std::swap(*rc->initial_metadata, initial_metadata_);
1244  switch (rc->type) {
1245  case RequestedCall::Type::BATCH_CALL:
1246  GPR_ASSERT(host_.has_value());
1247  GPR_ASSERT(path_.has_value());
1248  rc->data.batch.details->host = grpc_slice_ref_internal(host_->c_slice());
1249  rc->data.batch.details->method =
1250  grpc_slice_ref_internal(path_->c_slice());
1251  rc->data.batch.details->deadline =
1252  deadline_.as_timespec(GPR_CLOCK_MONOTONIC);
1253  rc->data.batch.details->flags = recv_initial_metadata_flags_;
1254  break;
1255  case RequestedCall::Type::REGISTERED_CALL:
1256  *rc->data.registered.deadline =
1257  deadline_.as_timespec(GPR_CLOCK_MONOTONIC);
1258  if (rc->data.registered.optional_payload != nullptr) {
1259  *rc->data.registered.optional_payload = payload_;
1260  payload_ = nullptr;
1261  }
1262  break;
1263  default:
1264  GPR_UNREACHABLE_CODE(return );
1265  }
1267  rc, &rc->completion, true);
1268 }
1269 
1271  grpc_call_element* call_elem = static_cast<grpc_call_element*>(arg);
1272  auto* calld = static_cast<Server::CallData*>(call_elem->call_data);
1273  auto* chand = static_cast<Server::ChannelData*>(call_elem->channel_data);
1274  RequestMatcherInterface* rm = calld->matcher_;
1275  Server* server = rm->server();
1276  if (!GRPC_ERROR_IS_NONE(error) || server->ShutdownCalled()) {
1277  calld->state_.store(CallState::ZOMBIED, std::memory_order_relaxed);
1278  calld->KillZombie();
1279  return;
1280  }
1281  rm->MatchOrQueue(chand->cq_idx(), calld);
1282 }
1283 
1284 namespace {
1285 
1286 void KillZombieClosure(void* call, grpc_error_handle /*error*/) {
1287  grpc_call_unref(static_cast<grpc_call*>(call));
1288 }
1289 
1290 } // namespace
1291 
1293  GRPC_CLOSURE_INIT(&kill_zombie_closure_, KillZombieClosure, call_,
1294  grpc_schedule_on_exec_ctx);
1295  ExecCtx::Run(DEBUG_LOCATION, &kill_zombie_closure_, GRPC_ERROR_NONE);
1296 }
1297 
1299  auto* chand = static_cast<ChannelData*>(elem->channel_data);
1300  if (server_->ShutdownCalled()) {
1301  state_.store(CallState::ZOMBIED, std::memory_order_relaxed);
1302  KillZombie();
1303  return;
1304  }
1305  // Find request matcher.
1306  matcher_ = server_->unregistered_request_matcher_.get();
1309  if (path_.has_value() && host_.has_value()) {
1311  chand->GetRegisteredMethod(host_->c_slice(), path_->c_slice());
1312  if (rm != nullptr) {
1313  matcher_ = rm->server_registered_method->matcher.get();
1314  payload_handling = rm->server_registered_method->payload_handling;
1315  }
1316  }
1317  // Start recv_message op if needed.
1318  switch (payload_handling) {
1319  case GRPC_SRM_PAYLOAD_NONE:
1320  PublishNewRpc(elem, GRPC_ERROR_NONE);
1321  break;
1323  grpc_op op;
1325  op.flags = 0;
1326  op.reserved = nullptr;
1327  op.data.recv_message.recv_message = &payload_;
1328  GRPC_CLOSURE_INIT(&publish_, PublishNewRpc, elem,
1329  grpc_schedule_on_exec_ctx);
1330  grpc_call_start_batch_and_execute(call_, &op, 1, &publish_);
1331  break;
1332  }
1333  }
1334 }
1335 
1337  void* arg, grpc_error_handle error) {
1338  grpc_call_element* elem = static_cast<grpc_call_element*>(arg);
1339  auto* calld = static_cast<Server::CallData*>(elem->call_data);
1340  if (!GRPC_ERROR_IS_NONE(error)) {
1341  gpr_log(GPR_DEBUG, "Failed call creation: %s",
1343  calld->FailCallCreation();
1344  return;
1345  }
1346  calld->StartNewRpc(elem);
1347 }
1348 
1352  GPR_ASSERT(batch->payload->recv_initial_metadata.recv_flags == nullptr);
1354  batch->payload->recv_initial_metadata.recv_initial_metadata;
1356  batch->payload->recv_initial_metadata.recv_initial_metadata_ready;
1357  batch->payload->recv_initial_metadata.recv_initial_metadata_ready =
1359  batch->payload->recv_initial_metadata.recv_flags =
1360  &recv_initial_metadata_flags_;
1361  }
1364  batch->payload->recv_trailing_metadata.recv_trailing_metadata_ready;
1365  batch->payload->recv_trailing_metadata.recv_trailing_metadata_ready =
1367  }
1369 }
1370 
1373  grpc_call_element* elem = static_cast<grpc_call_element*>(arg);
1374  CallData* calld = static_cast<CallData*>(elem->call_data);
1375  if (GRPC_ERROR_IS_NONE(error)) {
1376  calld->path_ = calld->recv_initial_metadata_->Take(HttpPathMetadata());
1377  auto* host =
1379  if (host != nullptr) calld->host_.emplace(host->Ref());
1380  } else {
1381  (void)GRPC_ERROR_REF(error);
1382  }
1383  auto op_deadline = calld->recv_initial_metadata_->get(GrpcTimeoutMetadata());
1384  if (op_deadline.has_value()) {
1385  calld->deadline_ = *op_deadline;
1386  }
1387  if (calld->host_.has_value() && calld->path_.has_value()) {
1388  /* do nothing */
1389  } else {
1390  /* Pass the error reference to calld->recv_initial_metadata_error */
1391  grpc_error_handle src_error = error;
1393  "Missing :authority or :path", &src_error, 1);
1394  GRPC_ERROR_UNREF(src_error);
1396  }
1398  calld->original_recv_initial_metadata_ready_ = nullptr;
1403  "continue server recv_trailing_metadata_ready");
1404  }
1406 }
1407 
1410  grpc_call_element* elem = static_cast<grpc_call_element*>(arg);
1411  CallData* calld = static_cast<CallData*>(elem->call_data);
1412  if (calld->original_recv_initial_metadata_ready_ != nullptr) {
1414  calld->seen_recv_trailing_metadata_ready_ = true;
1416  RecvTrailingMetadataReady, elem,
1417  grpc_schedule_on_exec_ctx);
1419  "deferring server recv_trailing_metadata_ready "
1420  "until after recv_initial_metadata_ready");
1421  return;
1422  }
1423  error =
1427  error);
1428 }
1429 
1432  auto* chand = static_cast<ChannelData*>(elem->channel_data);
1433  new (elem->call_data) Server::CallData(elem, *args, chand->server());
1434  return GRPC_ERROR_NONE;
1435 }
1436 
1438  grpc_call_element* elem, const grpc_call_final_info* /*final_info*/,
1439  grpc_closure* /*ignored*/) {
1440  auto* calld = static_cast<CallData*>(elem->call_data);
1441  calld->~CallData();
1442 }
1443 
1446  auto* calld = static_cast<CallData*>(elem->call_data);
1448 }
1449 
1450 } // namespace grpc_core
1451 
1452 //
1453 // C-core API
1454 //
1455 
1458  GRPC_API_TRACE("grpc_server_create(%p, %p)", 2, (args, reserved));
1461  .channel_args_preconditioning()
1462  .PreconditionChannelArgs(args));
1463  return server->c_ptr();
1464 }
1465 
1468  void* reserved) {
1470  "grpc_server_register_completion_queue(server=%p, cq=%p, reserved=%p)", 3,
1471  (server, cq, reserved));
1472  GPR_ASSERT(!reserved);
1473  auto cq_type = grpc_get_cq_completion_type(cq);
1474  if (cq_type != GRPC_CQ_NEXT && cq_type != GRPC_CQ_CALLBACK) {
1475  gpr_log(GPR_INFO,
1476  "Completion queue of type %d is being registered as a "
1477  "server-completion-queue",
1478  static_cast<int>(cq_type));
1479  /* Ideally we should log an error and abort but ruby-wrapped-language API
1480  calls grpc_completion_queue_pluck() on server completion queues */
1481  }
1483 }
1484 
1486  grpc_server* server, const char* method, const char* host,
1488  uint32_t flags) {
1490  "grpc_server_register_method(server=%p, method=%s, host=%s, "
1491  "flags=0x%08x)",
1492  4, (server, method, host, flags));
1494  method, host, payload_handling, flags);
1495 }
1496 
1499  GRPC_API_TRACE("grpc_server_start(server=%p)", 1, (server));
1501 }
1502 
1504  grpc_completion_queue* cq, void* tag) {
1505  grpc_core::ApplicationCallbackExecCtx callback_exec_ctx;
1507  GRPC_API_TRACE("grpc_server_shutdown_and_notify(server=%p, cq=%p, tag=%p)", 3,
1508  (server, cq, tag));
1510 }
1511 
1513  grpc_core::ApplicationCallbackExecCtx callback_exec_ctx;
1515  GRPC_API_TRACE("grpc_server_cancel_all_calls(server=%p)", 1, (server));
1517 }
1518 
1520  grpc_core::ApplicationCallbackExecCtx callback_exec_ctx;
1522  GRPC_API_TRACE("grpc_server_destroy(server=%p)", 1, (server));
1524 }
1525 
1528  grpc_metadata_array* request_metadata,
1529  grpc_completion_queue* cq_bound_to_call,
1530  grpc_completion_queue* cq_for_notification, void* tag) {
1531  grpc_core::ApplicationCallbackExecCtx callback_exec_ctx;
1535  "grpc_server_request_call("
1536  "server=%p, call=%p, details=%p, initial_metadata=%p, "
1537  "cq_bound_to_call=%p, cq_for_notification=%p, tag=%p)",
1538  7,
1539  (server, call, details, request_metadata, cq_bound_to_call,
1540  cq_for_notification, tag));
1542  call, details, request_metadata, cq_bound_to_call, cq_for_notification,
1543  tag);
1544 }
1545 
1547  grpc_server* server, void* registered_method, grpc_call** call,
1548  gpr_timespec* deadline, grpc_metadata_array* request_metadata,
1549  grpc_byte_buffer** optional_payload,
1550  grpc_completion_queue* cq_bound_to_call,
1551  grpc_completion_queue* cq_for_notification, void* tag_new) {
1552  grpc_core::ApplicationCallbackExecCtx callback_exec_ctx;
1555  auto* rm =
1556  static_cast<grpc_core::Server::RegisteredMethod*>(registered_method);
1558  "grpc_server_request_registered_call("
1559  "server=%p, registered_method=%p, call=%p, deadline=%p, "
1560  "request_metadata=%p, "
1561  "optional_payload=%p, cq_bound_to_call=%p, cq_for_notification=%p, "
1562  "tag=%p)",
1563  9,
1564  (server, registered_method, call, deadline, request_metadata,
1565  optional_payload, cq_bound_to_call, cq_for_notification, tag_new));
1567  rm, call, deadline, request_metadata, optional_payload, cq_bound_to_call,
1568  cq_for_notification, tag_new);
1569 }
1570 
1572  grpc_server* server, grpc_server_config_fetcher* server_config_fetcher) {
1573  grpc_core::ApplicationCallbackExecCtx callback_exec_ctx;
1575  GRPC_API_TRACE("grpc_server_set_config_fetcher(server=%p, config_fetcher=%p)",
1576  2, (server, server_config_fetcher));
1578  std::unique_ptr<grpc_server_config_fetcher>(server_config_fetcher));
1579 }
1580 
1582  grpc_server_config_fetcher* server_config_fetcher) {
1583  grpc_core::ApplicationCallbackExecCtx callback_exec_ctx;
1585  GRPC_API_TRACE("grpc_server_config_fetcher_destroy(config_fetcher=%p)", 1,
1586  (server_config_fetcher));
1587  delete server_config_fetcher;
1588 }
grpc::Server::AllocatingRequestMatcherBatch::AllocatingRequestMatcherBatch
AllocatingRequestMatcherBatch(Server *server, grpc_completion_queue *cq, std::function< BatchCallAllocation()> allocator)
Definition: src/core/lib/surface/server.cc:375
GRPC_CLOSURE_INIT
#define GRPC_CLOSURE_INIT(closure, cb, cb_arg, scheduler)
Definition: closure.h:115
grpc_core::Server::SetupTransport
grpc_error_handle SetupTransport(grpc_transport *transport, grpc_pollset *accepting_pollset, const grpc_channel_args *args, const RefCountedPtr< channelz::SocketNode > &socket_node)
Definition: src/core/lib/surface/server.cc:605
GPR_TIMESPAN
@ GPR_TIMESPAN
Definition: gpr_types.h:45
grpc_core::Server::CallData::call_combiner_
CallCombiner * call_combiner_
Definition: src/core/lib/surface/server.h:356
GPR_INFO
#define GPR_INFO
Definition: include/grpc/impl/codegen/log.h:56
GRPC_SRM_PAYLOAD_NONE
@ GRPC_SRM_PAYLOAD_NONE
Definition: grpc.h:398
grpc_core::Server::ListenerDestroyDone
static void ListenerDestroyDone(void *arg, grpc_error_handle error)
Definition: src/core/lib/surface/server.cc:768
grpc_op::flags
uint32_t flags
Definition: grpc_types.h:644
grpc_call_error
grpc_call_error
Definition: grpc_types.h:464
grpc::Server::RequestedCall::mpscq_node
MultiProducerSingleConsumerQueue::Node mpscq_node
Definition: src/core/lib/surface/server.cc:101
grpc_core::GrpcTimeoutMetadata
Definition: metadata_batch.h:59
grpc::ChannelData::Destroy
virtual void Destroy(grpc_channel_element *)
Definition: common/channel_filter.h:215
grpc_core::MixHash32
uint32_t MixHash32(uint32_t a, uint32_t b)
Definition: useful.h:123
channelz_node_
RefCountedPtr< channelz::SubchannelNode > channelz_node_
Definition: health_check_client.cc:154
grpc_server_cancel_all_calls
void grpc_server_cancel_all_calls(grpc_server *server)
Definition: src/core/lib/surface/server.cc:1512
GRPC_ERROR_NONE
#define GRPC_ERROR_NONE
Definition: error.h:234
log.h
grpc_core::Server::ChannelData::list_position_
absl::optional< std::list< ChannelData * >::iterator > list_position_
Definition: src/core/lib/surface/server.h:258
grpc::Server::RealRequestMatcher
Definition: src/core/lib/surface/server.cc:200
grpc_core::Server::CallData::recv_initial_metadata_
grpc_metadata_batch * recv_initial_metadata_
Definition: src/core/lib/surface/server.h:343
core_configuration.h
grpc::Server::RealRequestMatcher::MatchOrQueue
void MatchOrQueue(size_t start_request_queue_index, CallData *calld) override
Definition: src/core/lib/surface/server.cc:272
mpscq.h
grpc_core::Server::SendGoaways
void SendGoaways() ABSL_LOCKS_EXCLUDED(mu_global_
Definition: src/core/lib/surface/server.cc:863
grpc_slice_ref_internal
const grpc_slice & grpc_slice_ref_internal(const grpc_slice &slice)
Definition: slice_refcount.h:32
MutexLock
#define MutexLock(x)
Definition: bloaty/third_party/re2/util/mutex.h:125
grpc::Server::RealRequestMatcher::~RealRequestMatcher
~RealRequestMatcher() override
Definition: src/core/lib/surface/server.cc:205
opencensus.proto.agent.common.v1.common_pb2.Node
Node
Definition: common_pb2.py:308
grpc::Server::RequestedCall::tag
void *const tag
Definition: src/core/lib/surface/server.cc:103
grpc::ChannelData
Represents channel data.
Definition: common/channel_filter.h:201
grpc::Server::RequestedCall::optional_payload
grpc_byte_buffer ** optional_payload
Definition: src/core/lib/surface/server.cc:115
grpc::Server::RequestedCall::call
grpc_call **const call
Definition: src/core/lib/surface/server.cc:105
call_
grpc_call * call_
Definition: rls.cc:669
grpc::Server::AllocatingRequestMatcherBase::request_queue_count
size_t request_queue_count() const override
Definition: src/core/lib/surface/server.cc:349
deadline_
Timestamp deadline_
Definition: channel_connectivity.cc:163
grpc_call_create
grpc_error_handle grpc_call_create(grpc_call_create_args *args, grpc_call **out_call)
Definition: call.cc:1758
GRPC_CQ_NEXT
@ GRPC_CQ_NEXT
Definition: grpc_types.h:760
connectivity_state.h
grpc_channel_stack_element
grpc_channel_element * grpc_channel_stack_element(grpc_channel_stack *channel_stack, size_t index)
Definition: channel_stack.cc:78
GPR_DEBUG_ASSERT
#define GPR_DEBUG_ASSERT(x)
Definition: include/grpc/impl/codegen/log.h:103
grpc::Server::AllocatingRequestMatcherRegistered::registered_method_
RegisteredMethod *const registered_method_
Definition: src/core/lib/surface/server.cc:433
grpc_core::Server::BatchCallAllocation
Definition: src/core/lib/surface/server.h:86
send_goaway
static void send_goaway(grpc_chttp2_transport *t, grpc_error_handle error, bool immediate_disconnect_hint)
Definition: chttp2_transport.cc:1815
grpc_core::MetadataMap::get
absl::optional< typename Which::ValueType > get(Which) const
Definition: metadata_batch.h:1067
grpc::Server::RegisteredMethod::matcher
std::unique_ptr< RequestMatcherInterface > matcher
Definition: src/core/lib/surface/server.cc:141
grpc_server_config_fetcher
Definition: src/core/lib/surface/server.h:497
recv_initial_metadata_error_
grpc_error_handle recv_initial_metadata_error_
Definition: retry_filter.cc:491
grpc_slice_from_copied_string
GPRAPI grpc_slice grpc_slice_from_copied_string(const char *source)
Definition: slice/slice.cc:177
grpc_core::Server::CallData::CallState
CallState
Definition: src/core/lib/surface/server.h:271
grpc_call_set_completion_queue
void grpc_call_set_completion_queue(grpc_call *call, grpc_completion_queue *cq)
Definition: call.cc:1763
grpc_core::Server::CallData::StartTransportStreamOpBatch
static void StartTransportStreamOpBatch(grpc_call_element *elem, grpc_transport_stream_op_batch *batch)
Definition: src/core/lib/surface/server.cc:1444
grpc::Server::RealRequestMatcher::RealRequestMatcher
RealRequestMatcher(Server *server)
Definition: src/core/lib/surface/server.cc:202
grpc_core::Server::unregistered_request_matcher_
std::unique_ptr< RequestMatcherInterface > unregistered_request_matcher_
Definition: src/core/lib/surface/server.h:472
grpc_core::Server::CallData::FailCallCreation
void FailCallCreation()
Definition: src/core/lib/surface/server.cc:1211
grpc_core::Server::ChannelData
Definition: src/core/lib/surface/server.h:221
grpc_channel_next_op
void grpc_channel_next_op(grpc_channel_element *elem, grpc_transport_op *op)
Definition: channel_stack.cc:264
grpc_core::Server::CallData::Publish
void Publish(size_t cq_idx, RequestedCall *rc)
Definition: src/core/lib/surface/server.cc:1239
grpc_core::InternallyRefCounted< Server >::Unref
void Unref()
Definition: orphanable.h:100
grpc_core
Definition: call_metric_recorder.h:31
grpc::Server::AllocatingRequestMatcherBatch::allocator_
std::function< BatchCallAllocation()> allocator_
Definition: src/core/lib/surface/server.cc:399
grpc_core::Server::ShutdownUnrefOnShutdownCall
absl::Notification * ShutdownUnrefOnShutdownCall() ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_global_) GRPC_MUST_USE_RESULT
Definition: src/core/lib/surface/server.h:424
grpc_core::MetadataMap::get_pointer
const metadata_detail::Value< Which >::StorageType * get_pointer(Which) const
Definition: metadata_batch.h:1039
grpc_metadata_array
Definition: grpc_types.h:579
channels_
std::vector< RefCountedPtr< Channel > > channels_
Definition: src/core/lib/surface/server.cc:496
grpc_core::Slice
Definition: src/core/lib/slice/slice.h:282
grpc_call_details
Definition: grpc_types.h:585
grpc_core::MutexLock
Definition: src/core/lib/gprpp/sync.h:88
grpc_core::HttpPathMetadata
Definition: metadata_batch.h:262
grpc_op::reserved
void * reserved
Definition: grpc_types.h:646
grpc_core::Server::mu_global_
Mutex mu_global_
Definition: src/core/lib/surface/server.h:461
string.h
grpc::Server::RealRequestMatcher::server_
Server *const server_
Definition: src/core/lib/surface/server.cc:318
grpc_core::Server::CallData::CallState::PENDING
@ PENDING
grpc_core::Server::pollsets_
std::vector< grpc_pollset * > pollsets_
Definition: src/core/lib/surface/server.h:451
grpc_core::slice_detail::BaseSlice::Hash
uint32_t Hash() const
Definition: src/core/lib/slice/slice.h:113
grpc::Server::RequestedCall::details
grpc_call_details * details
Definition: src/core/lib/surface/server.cc:110
grpc::Server::RealRequestMatcher::server
Server * server() const override
Definition: src/core/lib/surface/server.cc:315
GRPC_CHANNEL_STACK_UNREF
#define GRPC_CHANNEL_STACK_UNREF(channel_stack, reason)
Definition: channel_stack.h:299
grpc_core::Server::ChannelRegisteredMethod::server_registered_method
RegisteredMethod * server_registered_method
Definition: src/core/lib/surface/server.h:208
useful.h
grpc_core::Server::CallData::recv_initial_metadata_ready_
grpc_closure recv_initial_metadata_ready_
Definition: src/core/lib/surface/server.h:345
grpc_transport_perform_op
void grpc_transport_perform_op(grpc_transport *transport, grpc_transport_op *op)
Definition: transport.cc:114
grpc_channel_element
Definition: channel_stack.h:186
elem
Timer elem
Definition: event_engine/iomgr_event_engine/timer_heap_test.cc:109
testing::internal::string
::std::string string
Definition: bloaty/third_party/protobuf/third_party/googletest/googletest/include/gtest/internal/gtest-port.h:881
error
grpc_error_handle error
Definition: retry_filter.cc:499
GRPC_CALL_ERROR_COMPLETION_QUEUE_SHUTDOWN
@ GRPC_CALL_ERROR_COMPLETION_QUEUE_SHUTDOWN
Definition: grpc_types.h:498
grpc_core::Server::CallData::KillZombie
void KillZombie()
Definition: src/core/lib/surface/server.cc:1292
grpc_core::ChannelArgs::FromC
static ChannelArgs FromC(const grpc_channel_args *args)
Definition: channel_args.cc:84
grpc_core::Server::starting_cv_
CondVar starting_cv_
Definition: src/core/lib/surface/server.h:467
grpc::Server::AllocatingRequestMatcherBase::cq
grpc_completion_queue * cq() const
Definition: src/core/lib/surface/server.cc:359
grpc::Server::AllocatingRequestMatcherRegistered::MatchOrQueue
void MatchOrQueue(size_t, CallData *calld) override
Definition: src/core/lib/surface/server.cc:413
grpc_core::Server::listeners_
std::list< Listener > listeners_
Definition: src/core/lib/surface/server.h:488
framework.rpc.grpc_channelz.Server
Server
Definition: grpc_channelz.py:42
completion_queue.h
grpc_core::Server::CancelAllCalls
void CancelAllCalls() ABSL_LOCKS_EXCLUDED(mu_global_)
Definition: src/core/lib/surface/server.cc:852
grpc_channel_get_channel_stack
grpc_channel_stack * grpc_channel_get_channel_stack(grpc_channel *channel)
Definition: src/core/lib/surface/channel.h:178
UINT32_MAX
#define UINT32_MAX
Definition: stdint-msvc2008.h:142
grpc_cq_completion
Definition: src/core/lib/surface/completion_queue.h:43
GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING
#define GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING(desc, errs, count)
Definition: error.h:307
GRPC_CALL_OK
@ GRPC_CALL_OK
Definition: grpc_types.h:466
grpc::Server::AllocatingRequestMatcherBatch::MatchOrQueue
void MatchOrQueue(size_t, CallData *calld) override
Definition: src/core/lib/surface/server.cc:380
grpc_server_create
grpc_server * grpc_server_create(const grpc_channel_args *args, void *reserved)
Definition: src/core/lib/surface/server.cc:1456
grpc::Server::RegisteredMethod
Definition: src/core/lib/surface/server.cc:124
grpc_core::ApplicationCallbackExecCtx
Definition: exec_ctx.h:283
grpc_core::Server::RegisterMethod
RegisteredMethod * RegisterMethod(const char *method, const char *host, grpc_server_register_method_payload_handling payload_handling, uint32_t flags)
Definition: src/core/lib/surface/server.cc:676
GRPC_ARG_ENABLE_CHANNELZ
#define GRPC_ARG_ENABLE_CHANNELZ
Definition: grpc_types.h:323
grpc_cq_end_op
void grpc_cq_end_op(grpc_completion_queue *cq, void *tag, grpc_error_handle error, void(*done)(void *done_arg, grpc_cq_completion *storage), void *done_arg, grpc_cq_completion *storage, bool internal)
Definition: completion_queue.cc:894
grpc_core::Server::ChannelData::InitTransport
void InitTransport(RefCountedPtr< Server > server, RefCountedPtr< Channel > channel, size_t cq_idx, grpc_transport *transport, intptr_t channelz_socket_uuid)
Definition: src/core/lib/surface/server.cc:1014
grpc::Server::RequestedCall::deadline
gpr_timespec * deadline
Definition: src/core/lib/surface/server.cc:114
time.h
check_documentation.path
path
Definition: check_documentation.py:57
a
int a
Definition: abseil-cpp/absl/container/internal/hash_policy_traits_test.cc:88
grpc_call_stack_ignore_set_pollset_or_pollset_set
void grpc_call_stack_ignore_set_pollset_or_pollset_set(grpc_call_element *, grpc_polling_entity *)
Definition: channel_stack.cc:233
grpc_call_stack_element
grpc_call_element * grpc_call_stack_element(grpc_call_stack *call_stack, size_t index)
Definition: channel_stack.cc:100
grpc_core::Server::Server
Server(ChannelArgs args)
Definition: src/core/lib/surface/server.cc:541
grpc_core::Server::SetBatchMethodAllocator
void SetBatchMethodAllocator(grpc_completion_queue *cq, std::function< BatchCallAllocation()> allocator)
Definition: src/core/lib/surface/server.cc:651
grpc_call_element::call_data
void * call_data
Definition: channel_stack.h:197
grpc_call_element
Definition: channel_stack.h:194
grpc::Server::RequestedCall::type
const Type type
Definition: src/core/lib/surface/server.cc:102
grpc_core::Server::RequestCall
grpc_call_error RequestCall(grpc_call **call, grpc_call_details *details, grpc_metadata_array *request_metadata, grpc_completion_queue *cq_bound_to_call, grpc_completion_queue *cq_for_notification, void *tag)
Definition: src/core/lib/surface/server.cc:935
grpc_core::Server::CallData::SetState
void SetState(CallState state)
Definition: src/core/lib/surface/server.cc:1200
channelz.h
grpc::Server::RequestMatcherInterface::~RequestMatcherInterface
virtual ~RequestMatcherInterface()
Definition: src/core/lib/surface/server.cc:159
grpc_server_register_completion_queue
void grpc_server_register_completion_queue(grpc_server *server, grpc_completion_queue *cq, void *reserved)
Definition: src/core/lib/surface/server.cc:1466
grpc_core::Server::CallData::recv_trailing_metadata_error_
grpc_error_handle recv_trailing_metadata_error_
Definition: src/core/lib/surface/server.h:352
grpc_channel_args
Definition: grpc_types.h:132
GRPC_TRACE_FLAG_ENABLED
#define GRPC_TRACE_FLAG_ENABLED(f)
Definition: debug/trace.h:114
grpc_core::Server::ValidateServerRequest
static grpc_call_error ValidateServerRequest(grpc_completion_queue *cq_for_notification, void *tag, grpc_byte_buffer **optional_payload, RegisteredMethod *rm)
Definition: src/core/lib/surface/server.cc:881
grpc_server_register_method_payload_handling
grpc_server_register_method_payload_handling
Definition: grpc.h:396
grpc_core::Server::CallData::original_recv_initial_metadata_ready_
grpc_closure * original_recv_initial_metadata_ready_
Definition: src/core/lib/surface/server.h:346
stats.h
grpc_core::Server::channelz_node_
RefCountedPtr< channelz::ServerNode > channelz_node_
Definition: src/core/lib/surface/server.h:447
grpc_core::Server::config_fetcher_
std::unique_ptr< grpc_server_config_fetcher > config_fetcher_
Definition: src/core/lib/surface/server.h:448
grpc_op::grpc_op_data::recv_message
struct grpc_op::grpc_op_data::grpc_op_recv_message recv_message
grpc_core::Server::HasOpenConnections
bool HasOpenConnections() ABSL_LOCKS_EXCLUDED(mu_global_)
Definition: src/core/lib/surface/server.cc:638
grpc_transport_op
Definition: transport.h:452
grpc::Server::RequestMatcherInterface::RequestCallWithPossiblePublish
virtual void RequestCallWithPossiblePublish(size_t request_queue_index, RequestedCall *call)=0
server_
Server *const server_
Definition: chttp2_server.cc:260
grpc_connectivity_state
grpc_connectivity_state
Definition: include/grpc/impl/codegen/connectivity_state.h:30
grpc_core::Server::ShutdownReady
bool ShutdownReady() const
Definition: src/core/lib/surface/server.h:442
channel_args_preconditioning.h
call
FilterStackCall * call
Definition: call.cc:750
grpc_op::data
union grpc_op::grpc_op_data data
grpc_core::Server::ChannelData::channelz_socket_uuid_
intptr_t channelz_socket_uuid_
Definition: src/core/lib/surface/server.h:266
grpc::Server::AllocatingRequestMatcherRegistered::AllocatingRequestMatcherRegistered
AllocatingRequestMatcherRegistered(Server *server, grpc_completion_queue *cq, RegisteredMethod *rm, std::function< RegisteredCallAllocation()> allocator)
Definition: src/core/lib/surface/server.cc:406
status.h
grpc_core::Server::DoneShutdownEvent
static void DoneShutdownEvent(void *server, grpc_cq_completion *)
Definition: src/core/lib/surface/server.h:376
grpc::Server::RegisteredMethod::method
const std::string method
Definition: src/core/lib/surface/server.cc:136
GRPC_ENABLE_CHANNELZ_DEFAULT
#define GRPC_ENABLE_CHANNELZ_DEFAULT
Definition: channelz.h:57
grpc_core::Server::CallData::StartNewRpc
void StartNewRpc(grpc_call_element *elem)
Definition: src/core/lib/surface/server.cc:1298
absl::Notification
Definition: abseil-cpp/absl/synchronization/notification.h:66
hash
uint64_t hash
Definition: ring_hash.cc:284
grpc_core::Server::CallData::recv_initial_metadata_error_
grpc_error_handle recv_initial_metadata_error_
Definition: src/core/lib/surface/server.h:347
grpc_core::Server::CallData::RecvTrailingMetadataReady
static void RecvTrailingMetadataReady(void *arg, grpc_error_handle error)
Definition: src/core/lib/surface/server.cc:1408
uint32_t
unsigned int uint32_t
Definition: stdint-msvc2008.h:80
grpc::Server::AllocatingRequestMatcherBase
Definition: src/core/lib/surface/server.cc:329
grpc_core::Server::CallData::MaybeActivate
bool MaybeActivate()
Definition: src/core/lib/surface/server.cc:1204
grpc_metadata_array_destroy
GRPCAPI void grpc_metadata_array_destroy(grpc_metadata_array *array)
Definition: metadata_array.cc:35
grpc_call_get_call_stack
grpc_call_stack * grpc_call_get_call_stack(grpc_call *call)
Definition: call.cc:1827
grpc::Server::RequestMatcherInterface::MatchOrQueue
virtual void MatchOrQueue(size_t start_request_queue_index, CallData *calld)=0
GRPC_SERVER_CHANNEL
@ GRPC_SERVER_CHANNEL
Definition: channel_stack_type.h:36
DEBUG_LOCATION
#define DEBUG_LOCATION
Definition: debug_location.h:41
grpc_op::grpc_op_data::grpc_op_recv_message::recv_message
struct grpc_byte_buffer ** recv_message
Definition: grpc_types.h:693
grpc_core::Server::cqs_
std::vector< grpc_completion_queue * > cqs_
Definition: src/core/lib/surface/server.h:450
grpc_core::Server::ChannelRegisteredMethod
Definition: src/core/lib/surface/server.h:207
grpc_core::Server::ChannelData::DestroyChannelElement
static void DestroyChannelElement(grpc_channel_element *elem)
Definition: src/core/lib/surface/server.cc:1172
grpc_error_add_child
grpc_error_handle grpc_error_add_child(grpc_error_handle src, grpc_error_handle child)
Definition: error.cc:678
grpc_core::Server::ChannelData::GetRegisteredMethod
ChannelRegisteredMethod * GetRegisteredMethod(const grpc_slice &host, const grpc_slice &path)
Definition: src/core/lib/surface/server.cc:1077
grpc::Server::RequestMatcherInterface
Definition: src/core/lib/surface/server.cc:157
grpc_server_start
void grpc_server_start(grpc_server *server)
Definition: src/core/lib/surface/server.cc:1497
channel
wrapped_grpc_channel * channel
Definition: src/php/ext/grpc/call.h:33
GRPC_STATS_INC_SERVER_REQUESTED_CALLS
#define GRPC_STATS_INC_SERVER_REQUESTED_CALLS()
Definition: stats_data.h:383
asyncio_get_stats.args
args
Definition: asyncio_get_stats.py:40
GRPC_STATUS_OK
@ GRPC_STATUS_OK
Definition: include/grpc/impl/codegen/status.h:30
grpc::Server::RequestedCall::registered
struct grpc_core::Server::RequestedCall::@37::@39 registered
grpc_core::Server::CallData::DestroyCallElement
static void DestroyCallElement(grpc_call_element *elem, const grpc_call_final_info *, grpc_closure *)
Definition: src/core/lib/surface/server.cc:1437
GRPC_OP_RECV_INITIAL_METADATA
@ GRPC_OP_RECV_INITIAL_METADATA
Definition: grpc_types.h:617
grpc_core::RefCountedPtr
Definition: ref_counted_ptr.h:35
absl::move
constexpr absl::remove_reference_t< T > && move(T &&t) noexcept
Definition: abseil-cpp/absl/utility/utility.h:221
GPR_ASSERT
#define GPR_ASSERT(x)
Definition: include/grpc/impl/codegen/log.h:94
grpc_core::Server::kServerTopFilter
static const grpc_channel_filter kServerTopFilter
Definition: src/core/lib/surface/server.h:79
grpc_core::Server::SetRegisteredMethodAllocator
void SetRegisteredMethodAllocator(grpc_completion_queue *cq, void *method_tag, std::function< RegisteredCallAllocation()> allocator)
Definition: src/core/lib/surface/server.cc:643
queue
Definition: sync_test.cc:39
grpc_core::grpc_server_channel_trace
TraceFlag grpc_server_channel_trace(false, "server_channel")
Definition: src/core/lib/surface/server.h:73
gpr_time_cmp
GPRAPI int gpr_time_cmp(gpr_timespec a, gpr_timespec b)
Definition: src/core/lib/gpr/time.cc:30
grpc_pollset_set_del_pollset
void grpc_pollset_set_del_pollset(grpc_pollset_set *pollset_set, grpc_pollset *pollset)
Definition: pollset_set.cc:42
grpc::Server::RequestedCall::initial_metadata
grpc_metadata_array *const initial_metadata
Definition: src/core/lib/surface/server.cc:107
grpc_core::CoreConfiguration::Get
static const CoreConfiguration & Get()
Definition: core_configuration.h:82
grpc::Server::RequestMatcherInterface::request_queue_count
virtual size_t request_queue_count() const =0
gen_stats_data.c_str
def c_str(s, encoding='ascii')
Definition: gen_stats_data.py:38
grpc_core::Server::CallData::recv_trailing_metadata_ready_
grpc_closure recv_trailing_metadata_ready_
Definition: src/core/lib/surface/server.h:350
grpc::Server::RequestMatcherInterface::ZombifyPending
virtual void ZombifyPending()=0
tag
static void * tag(intptr_t t)
Definition: bad_client.cc:318
grpc_core::Server::CallData::CallState::ZOMBIED
@ ZOMBIED
max
int max
Definition: bloaty/third_party/zlib/examples/enough.c:170
grpc_core::Server::CallData
Definition: src/core/lib/surface/server.h:269
Type
Definition: bloaty/third_party/protobuf/src/google/protobuf/type.pb.h:182
grpc_get_cq_completion_type
grpc_cq_completion_type grpc_get_cq_completion_type(grpc_completion_queue *cq)
Definition: completion_queue.cc:581
grpc_channel_element::channel_data
void * channel_data
Definition: channel_stack.h:188
grpc_core::Server::channels_
std::list< ChannelData * > channels_
Definition: src/core/lib/surface/server.h:486
grpc::Server::RequestMatcherInterface::server
virtual Server * server() const =0
grpc_channel_stack_no_post_init
void grpc_channel_stack_no_post_init(grpc_channel_stack *, grpc_channel_element *)
Definition: channel_stack.cc:282
grpc_call_unref
GRPCAPI void grpc_call_unref(grpc_call *call)
Definition: call.cc:1770
gpr_time_sub
GPRAPI gpr_timespec gpr_time_sub(gpr_timespec a, gpr_timespec b)
Definition: src/core/lib/gpr/time.cc:168
req
static uv_connect_t req
Definition: test-connection-fail.c:30
grpc_core::HttpAuthorityMetadata
Definition: metadata_batch.h:256
grpc_core::InternallyRefCounted< Server >::Ref
RefCountedPtr< Server > Ref() GRPC_MUST_USE_RESULT
Definition: orphanable.h:90
slice
grpc_slice slice
Definition: src/core/lib/surface/server.cc:467
gpr_log
GPRAPI void gpr_log(const char *file, int line, gpr_log_severity severity, const char *format,...) GPR_PRINT_FORMAT_CHECK(4
grpc::Server::RegisteredMethod::RegisteredMethod
RegisteredMethod(const char *method_arg, const char *host_arg, grpc_server_register_method_payload_handling payload_handling_arg, uint32_t flags_arg)
Definition: src/core/lib/surface/server.cc:125
grpc_core::Server::CallData::Start
void Start(grpc_call_element *elem)
Definition: src/core/lib/surface/server.cc:1226
grpc::Server::RequestedCall::method
RegisteredMethod * method
Definition: src/core/lib/surface/server.cc:113
grpc_completion_queue
Definition: completion_queue.cc:347
grpc_core::Server::RegisteredCallAllocation
Definition: src/core/lib/surface/server.h:97
transport
grpc_transport transport
Definition: filter_fuzzer.cc:146
grpc::Server::RealRequestMatcher::request_queue_count
size_t request_queue_count() const override
Definition: src/core/lib/surface/server.cc:231
channel_args_
const grpc_channel_args * channel_args_
Definition: rls.cc:710
closure
grpc_closure closure
Definition: src/core/lib/surface/server.cc:466
grpc_call_create_args
Definition: src/core/lib/surface/call.h:51
grpc_core::CondVar::Signal
void Signal()
Definition: src/core/lib/gprpp/sync.h:134
google::protobuf::python::repeated_composite_container::Pop
static PyObject * Pop(PyObject *pself, PyObject *args)
Definition: bloaty/third_party/protobuf/python/google/protobuf/pyext/repeated_composite_container.cc:445
GRPC_MAX_CHANNEL_TRACE_EVENT_MEMORY_PER_NODE_DEFAULT
#define GRPC_MAX_CHANNEL_TRACE_EVENT_MEMORY_PER_NODE_DEFAULT
Definition: channelz.h:63
grpc::Server::RegisteredMethod::flags
const uint32_t flags
Definition: src/core/lib/surface/server.cc:139
grpc_call
struct grpc_call grpc_call
Definition: grpc_types.h:70
connectivity_state.h
grpc_byte_buffer
Definition: grpc_types.h:43
grpc::Server::RequestedCall::completion
grpc_cq_completion completion
Definition: src/core/lib/surface/server.cc:106
grpc::Server::RegisteredMethod::host
const std::string host
Definition: src/core/lib/surface/server.cc:137
grpc_cq_pollset
grpc_pollset * grpc_cq_pollset(grpc_completion_queue *cq)
Definition: completion_queue.cc:1433
grpc::CallData
Represents call data.
Definition: common/channel_filter.h:224
GRPC_STATS_INC_SERVER_CQS_CHECKED
#define GRPC_STATS_INC_SERVER_CQS_CHECKED(value)
Definition: stats_data.h:429
grpc_channel_next_get_info
void grpc_channel_next_get_info(grpc_channel_element *elem, const grpc_channel_info *channel_info)
Definition: channel_stack.cc:258
grpc::Server::RequestedCall::batch
struct grpc_core::Server::RequestedCall::@37::@38 batch
GRPC_CALL_COMBINER_STOP
#define GRPC_CALL_COMBINER_STOP(call_combiner, reason)
Definition: call_combiner.h:58
pollset_set.h
grpc_op
Definition: grpc_types.h:640
grpc_core::Server::AddListener
void AddListener(OrphanablePtr< ListenerInterface > listener)
Definition: src/core/lib/surface/server.cc:559
grpc::Server::RequestedCall::RequestedCall
RequestedCall(void *tag_arg, grpc_completion_queue *call_cq, grpc_call **call_arg, grpc_metadata_array *initial_md, grpc_call_details *details)
Definition: src/core/lib/surface/server.cc:75
grpc_channel_args_destroy
void grpc_channel_args_destroy(grpc_channel_args *a)
Definition: channel_args.cc:360
grpc::Server::RegisteredMethod::payload_handling
const grpc_server_register_method_payload_handling payload_handling
Definition: src/core/lib/surface/server.cc:138
channel_
RefCountedPtr< Channel > channel_
Definition: channel_connectivity.cc:209
arg
Definition: cmdline.cc:40
grpc_slice_from_static_string
GPRAPI grpc_slice grpc_slice_from_static_string(const char *source)
Definition: slice/slice.cc:89
grpc_transport_stream_op_batch::payload
grpc_transport_stream_op_batch_payload * payload
Definition: transport.h:307
grpc::Server::AllocatingRequestMatcherBase::cq_idx_
size_t cq_idx_
Definition: src/core/lib/surface/server.cc:367
std::swap
void swap(Json::Value &a, Json::Value &b)
Specialize std::swap() for Json::Value.
Definition: third_party/bloaty/third_party/protobuf/conformance/third_party/jsoncpp/json.h:1226
call_combiner_
CallCombiner * call_combiner_
Definition: client_channel.cc:393
grpc_core::Server::CallData::StartTransportStreamOpBatchImpl
void StartTransportStreamOpBatchImpl(grpc_call_element *elem, grpc_transport_stream_op_batch *batch)
Definition: src/core/lib/surface/server.cc:1349
grpc_slice
Definition: include/grpc/impl/codegen/slice.h:65
grpc_server_register_method
void * grpc_server_register_method(grpc_server *server, const char *method, const char *host, grpc_server_register_method_payload_handling payload_handling, uint32_t flags)
Definition: src/core/lib/surface/server.cc:1485
grpc_core::Server::ChannelRegisteredMethod::method
Slice method
Definition: src/core/lib/surface/server.h:211
GPR_CLOCK_MONOTONIC
@ GPR_CLOCK_MONOTONIC
Definition: gpr_types.h:36
grpc_server
struct grpc_server grpc_server
Definition: grpc_types.h:65
grpc_core::Server::Start
void Start() ABSL_LOCKS_EXCLUDED(mu_global_)
Definition: src/core/lib/surface/server.cc:568
grpc_core::Server::last_shutdown_message_time_
gpr_timespec last_shutdown_message_time_
Definition: src/core/lib/surface/server.h:492
grpc_server_request_registered_call
grpc_call_error grpc_server_request_registered_call(grpc_server *server, void *registered_method, grpc_call **call, gpr_timespec *deadline, grpc_metadata_array *request_metadata, grpc_byte_buffer **optional_payload, grpc_completion_queue *cq_bound_to_call, grpc_completion_queue *cq_for_notification, void *tag_new)
Definition: src/core/lib/surface/server.cc:1546
intptr_t
_W64 signed int intptr_t
Definition: stdint-msvc2008.h:118
grpc::Server::RequestedCall
Definition: src/core/lib/surface/server.cc:72
grpc_make_transport_op
grpc_transport_op * grpc_make_transport_op(grpc_closure *on_complete)
Definition: transport.cc:205
NOT_STARTED
@ NOT_STARTED
Definition: win/tty.c:81
grpc_call_next_op
void grpc_call_next_op(grpc_call_element *elem, grpc_transport_stream_op_batch *op)
Definition: channel_stack.cc:251
grpc_server_shutdown_and_notify
void grpc_server_shutdown_and_notify(grpc_server *server, grpc_completion_queue *cq, void *tag)
Definition: src/core/lib/surface/server.cc:1503
grpc_call_element_args
Definition: channel_stack.h:80
batch
grpc_transport_stream_op_batch * batch
Definition: retry_filter.cc:243
grpc_core::MetadataMap::Take
absl::enable_if_t< Which::kRepeatable==false, absl::optional< typename Which::ValueType > > Take(Which which)
Definition: metadata_batch.h:1115
slice_internal.h
grpc_core::Server::ShutdownAndNotify
void ShutdownAndNotify(grpc_completion_queue *cq, void *tag) ABSL_LOCKS_EXCLUDED(mu_global_
Definition: src/core/lib/surface/server.cc:797
GPR_ERROR
#define GPR_ERROR
Definition: include/grpc/impl/codegen/log.h:57
GPR_UNREACHABLE_CODE
#define GPR_UNREACHABLE_CODE(STATEMENT)
Definition: impl/codegen/port_platform.h:652
rm
static bool rm(upb_table *t, lookupkey_t key, upb_value *val, upb_tabkey *removed, uint32_t hash, eqlfunc_t *eql)
Definition: bloaty/third_party/protobuf/php/ext/google/protobuf/upb.c:1477
grpc_core::Server::mu_call_
void mu_call_
Definition: src/core/lib/surface/server.h:196
b
uint64_t b
Definition: abseil-cpp/absl/container/internal/layout_test.cc:53
grpc_core::Server::CallData::PublishNewRpc
static void PublishNewRpc(void *arg, grpc_error_handle error)
Definition: src/core/lib/surface/server.cc:1270
grpc_cq_can_listen
bool grpc_cq_can_listen(grpc_completion_queue *cq)
Definition: completion_queue.cc:1437
GRPC_CALL_COMBINER_START
#define GRPC_CALL_COMBINER_START(call_combiner, closure, error, reason)
Definition: call_combiner.h:56
channel_stack_type.h
gpr_now
GPRAPI gpr_timespec gpr_now(gpr_clock_type clock)
grpc_core::ExecCtx
Definition: exec_ctx.h:97
grpc_core::Server::CallData::host_
absl::optional< Slice > host_
Definition: src/core/lib/surface/server.h:329
grpc_core::Server::ChannelData::Destroy
void Destroy() ABSL_EXCLUSIVE_LOCKS_REQUIRED(server_ -> mu_global_)
Definition: src/core/lib/surface/server.cc:1142
setup.idx
idx
Definition: third_party/bloaty/third_party/capstone/bindings/python/setup.py:197
grpc_channel_filter
Definition: channel_stack.h:111
grpc_core::Server::ChannelData::~ChannelData
~ChannelData()
Definition: src/core/lib/surface/server.cc:997
grpc_op::op
grpc_op_type op
Definition: grpc_types.h:642
GRPC_ERROR_CREATE_FROM_STATIC_STRING
#define GRPC_ERROR_CREATE_FROM_STATIC_STRING(desc)
Definition: error.h:291
grpc::Server::ChannelData::ConnectivityWatcher::ConnectivityWatcher
ConnectivityWatcher(ChannelData *chand)
Definition: src/core/lib/surface/server.cc:976
grpc_core::Server::ChannelData::AcceptStream
static void AcceptStream(void *arg, grpc_transport *, const void *transport_server_data)
Definition: src/core/lib/surface/server.cc:1106
grpc::Server::RealRequestMatcher::ZombifyPending
void ZombifyPending() override
Definition: src/core/lib/surface/server.cc:211
grpc::Server::AllocatingRequestMatcherBase::server_
Server *const server_
Definition: src/core/lib/surface/server.cc:365
details
static grpc_slice details
Definition: test/core/fling/client.cc:46
grpc::Server::AllocatingRequestMatcherBase::RequestCallWithPossiblePublish
void RequestCallWithPossiblePublish(size_t, RequestedCall *) final
Definition: src/core/lib/surface/server.cc:351
GRPC_CHANNEL_STACK_REF
#define GRPC_CHANNEL_STACK_REF(channel_stack, reason)
Definition: channel_stack.h:297
grpc_core::Server::QueueRequestedCall
grpc_call_error QueueRequestedCall(size_t cq_idx, RequestedCall *rc)
Definition: src/core/lib/surface/server.cc:916
grpc_core::channelz::BaseNode::uuid
intptr_t uuid() const
Definition: channelz.h:105
grpc::Server::AllocatingRequestMatcherBatch
Definition: src/core/lib/surface/server.cc:372
grpc_server_set_config_fetcher
void grpc_server_set_config_fetcher(grpc_server *server, grpc_server_config_fetcher *server_config_fetcher)
Definition: src/core/lib/surface/server.cc:1571
grpc::Server::ChannelData::ConnectivityWatcher::channel_
const RefCountedPtr< Channel > channel_
Definition: src/core/lib/surface/server.cc:990
grpc_transport_stream_op_batch::recv_initial_metadata
bool recv_initial_metadata
Definition: transport.h:319
grpc::Server::AllocatingRequestMatcherRegistered::allocator_
std::function< RegisteredCallAllocation()> allocator_
Definition: src/core/lib/surface/server.cc:434
GRPC_OP_RECV_MESSAGE
@ GRPC_OP_RECV_MESSAGE
Definition: grpc_types.h:621
original_recv_initial_metadata_ready_
grpc_closure * original_recv_initial_metadata_ready_
Definition: message_decompress_filter.cc:115
grpc_core::Server::CallData::RecvInitialMetadataBatchComplete
static void RecvInitialMetadataBatchComplete(void *arg, grpc_error_handle error)
Definition: src/core/lib/surface/server.cc:1336
grpc_core::Server::CallData::seen_recv_trailing_metadata_ready_
bool seen_recv_trailing_metadata_ready_
Definition: src/core/lib/surface/server.h:349
grpc_cq_begin_op
bool grpc_cq_begin_op(grpc_completion_queue *cq, void *tag)
Definition: completion_queue.cc:672
grpc_core::Server::ChannelData::FinishDestroy
static void FinishDestroy(void *arg, grpc_error_handle error)
Definition: src/core/lib/surface/server.cc:1132
grpc_core::Server::ChannelData::registered_methods_
std::unique_ptr< std::vector< ChannelRegisteredMethod > > registered_methods_
Definition: src/core/lib/surface/server.h:263
grpc_core::Server::RegisterCompletionQueue
void RegisterCompletionQueue(grpc_completion_queue *cq)
Definition: src/core/lib/surface/server.cc:659
grpc::Server::RequestedCall::RequestedCall
RequestedCall(void *tag_arg, grpc_completion_queue *call_cq, grpc_call **call_arg, grpc_metadata_array *initial_md, RegisteredMethod *rm, gpr_timespec *deadline, grpc_byte_buffer **optional_payload)
Definition: src/core/lib/surface/server.cc:87
grpc_core::Server
Definition: src/core/lib/surface/server.h:75
GRPC_ERROR_REF
#define GRPC_ERROR_REF(err)
Definition: error.h:261
absl_status_to_grpc_error
grpc_error_handle absl_status_to_grpc_error(absl::Status status)
Definition: error_utils.cc:167
debug_location.h
grpc_core::Server::started_
bool started_
Definition: src/core/lib/surface/server.h:452
grpc_core::Server::listeners_destroyed_
size_t listeners_destroyed_
Definition: src/core/lib/surface/server.h:489
grpc::Server::AllocatingRequestMatcherBase::cq_idx
size_t cq_idx() const
Definition: src/core/lib/surface/server.cc:362
path_
grpc_slice path_
Definition: client_channel.cc:389
grpc_core::Server::CallData::InitCallElement
static grpc_error_handle InitCallElement(grpc_call_element *elem, const grpc_call_element_args *args)
Definition: src/core/lib/surface/server.cc:1430
GRPC_CALL_ERROR_PAYLOAD_TYPE_MISMATCH
@ GRPC_CALL_ERROR_PAYLOAD_TYPE_MISMATCH
Definition: grpc_types.h:496
grpc_error_set_int
grpc_error_handle grpc_error_set_int(grpc_error_handle src, grpc_error_ints which, intptr_t value)
Definition: error.cc:613
recv_initial_metadata_ready_
grpc_closure recv_initial_metadata_ready_
Definition: retry_filter.cc:464
absl::flags_internal
Definition: abseil-cpp/absl/flags/commandlineflag.h:40
server
Definition: examples/python/async_streaming/server.py:1
grpc::Server::AllocatingRequestMatcherBase::cq_
grpc_completion_queue *const cq_
Definition: src/core/lib/surface/server.cc:366
grpc_core::Server::ValidateServerRequestAndCq
grpc_call_error ValidateServerRequestAndCq(size_t *cq_idx, grpc_completion_queue *cq_for_notification, void *tag, grpc_byte_buffer **optional_payload, RegisteredMethod *rm)
Definition: src/core/lib/surface/server.cc:895
GRPC_ARG_MAX_CHANNEL_TRACE_EVENT_MEMORY_PER_NODE
#define GRPC_ARG_MAX_CHANNEL_TRACE_EVENT_MEMORY_PER_NODE
Definition: grpc_types.h:318
grpc::Server::AllocatingRequestMatcherBase::server
Server * server() const override
Definition: src/core/lib/surface/server.cc:356
exec_ctx
grpc_core::ExecCtx exec_ctx
Definition: end2end_binder_transport_test.cc:75
grpc_error_std_string
std::string grpc_error_std_string(grpc_error_handle error)
Definition: error.cc:944
grpc::Server
Definition: include/grpcpp/server.h:59
grpc::Server::RealRequestMatcher::requests_per_cq_
std::vector< LockedMultiProducerSingleConsumerQueue > requests_per_cq_
Definition: src/core/lib/surface/server.cc:320
grpc_core::Server::channel_args_
const grpc_channel_args *const channel_args_
Definition: src/core/lib/surface/server.h:446
absl::Status
Definition: third_party/abseil-cpp/absl/status/status.h:424
grpc::Server::AllocatingRequestMatcherBase::ZombifyPending
void ZombifyPending() override
Definition: src/core/lib/surface/server.cc:343
grpc_core::Server::ChannelRegisteredMethod::host
Slice host
Definition: src/core/lib/surface/server.h:212
grpc::Server::RealRequestMatcher::KillRequests
void KillRequests(grpc_error_handle error) override
Definition: src/core/lib/surface/server.cc:220
grpc_core::Slice::FromExternalString
static Slice FromExternalString(absl::string_view str)
Definition: src/core/lib/slice/slice.h:382
grpc_core::OrphanablePtr
std::unique_ptr< T, Deleter > OrphanablePtr
Definition: orphanable.h:64
grpc_core::Server::RequestRegisteredCall
grpc_call_error RequestRegisteredCall(RegisteredMethod *rm, grpc_call **call, gpr_timespec *deadline, grpc_metadata_array *request_metadata, grpc_byte_buffer **optional_payload, grpc_completion_queue *cq_bound_to_call, grpc_completion_queue *cq_for_notification, void *tag_new)
Definition: src/core/lib/surface/server.cc:952
GRPC_STATS_INC_SERVER_SLOWPATH_REQUESTS_QUEUED
#define GRPC_STATS_INC_SERVER_SLOWPATH_REQUESTS_QUEUED()
Definition: stats_data.h:385
std
Definition: grpcpp/impl/codegen/async_unary_call.h:407
grpc_core::CondVar::Wait
void Wait(Mutex *mu)
Definition: src/core/lib/gprpp/sync.h:137
grpc_server_config_fetcher_destroy
void grpc_server_config_fetcher_destroy(grpc_server_config_fetcher *server_config_fetcher)
Definition: src/core/lib/surface/server.cc:1581
grpc_core::Server::ShutdownCalled
bool ShutdownCalled() const
Definition: src/core/lib/surface/server.h:435
GRPC_CQ_INTERNAL_UNREF
#define GRPC_CQ_INTERNAL_UNREF(cq, reason)
Definition: src/core/lib/surface/completion_queue.h:65
grpc_transport_stream_op_batch_payload::recv_initial_metadata
grpc_metadata_batch * recv_initial_metadata
Definition: transport.h:390
recv_trailing_metadata_ready_
grpc_closure recv_trailing_metadata_ready_
Definition: retry_filter.cc:473
grpc::Server::RequestMatcherInterface::KillRequests
virtual void KillRequests(grpc_error_handle error)=0
grpc_byte_buffer_destroy
GRPCAPI void grpc_byte_buffer_destroy(grpc_byte_buffer *bb)
Definition: byte_buffer.cc:81
grpc_slice_hash_internal
uint32_t grpc_slice_hash_internal(const grpc_slice &s)
Definition: slice_internal.h:67
arg
struct arg arg
grpc_core::Server::ChannelData::server_
RefCountedPtr< Server > server_
Definition: src/core/lib/surface/server.h:253
grpc_core::Server::StopListening
void StopListening()
Definition: src/core/lib/surface/server.cc:836
grpc_core::Server::FailCall
void FailCall(size_t cq_idx, RequestedCall *rc, grpc_error_handle error)
Definition: src/core/lib/surface/server.cc:706
grpc_core::Server::DoneRequestEvent
static void DoneRequestEvent(void *req, grpc_cq_completion *completion)
Definition: src/core/lib/surface/server.cc:702
grpc::Server::AllocatingRequestMatcherRegistered
Definition: src/core/lib/surface/server.cc:403
state
Definition: bloaty/third_party/zlib/contrib/blast/blast.c:41
exec_ctx.h
server.h
grpc_core::Server::~Server
~Server() override
Definition: src/core/lib/surface/server.cc:544
slice_refcount.h
closure
Definition: proxy.cc:59
grpc::Server::RequestedCall::data
union grpc_core::Server::RequestedCall::@37 data
GRPC_CQ_INTERNAL_REF
#define GRPC_CQ_INTERNAL_REF(cq, reason)
Definition: src/core/lib/surface/completion_queue.h:63
grpc_core::Server::registered_methods_
std::vector< std::unique_ptr< RegisteredMethod > > registered_methods_
Definition: src/core/lib/surface/server.h:469
GRPC_ERROR_UNREF
#define GRPC_ERROR_UNREF(err)
Definition: error.h:262
grpc_core::ChannelArgs
Definition: channel_args.h:111
grpc_core::ExecCtx::Run
static void Run(const DebugLocation &location, grpc_closure *closure, grpc_error_handle error)
Definition: exec_ctx.cc:98
state_
grpc_connectivity_state state_
Definition: channel_connectivity.cc:213
grpc::Server::AllocatingRequestMatcherBase::AllocatingRequestMatcherBase
AllocatingRequestMatcherBase(Server *server, grpc_completion_queue *cq)
Definition: src/core/lib/surface/server.cc:331
grpc_channel
struct grpc_channel grpc_channel
Definition: grpc_types.h:62
grpc::Server::ChannelData::ConnectivityWatcher::chand_
ChannelData *const chand_
Definition: src/core/lib/surface/server.cc:989
grpc_transport
Definition: transport_impl.h:89
grpc_core::Server::CallData::~CallData
~CallData()
Definition: src/core/lib/surface/server.cc:1193
channel_args.h
grpc_core::Server::CallData::RecvInitialMetadataReady
static void RecvInitialMetadataReady(void *arg, grpc_error_handle error)
Definition: src/core/lib/surface/server.cc:1371
grpc_server_request_call
grpc_call_error grpc_server_request_call(grpc_server *server, grpc_call **call, grpc_call_details *details, grpc_metadata_array *request_metadata, grpc_completion_queue *cq_bound_to_call, grpc_completion_queue *cq_for_notification, void *tag)
Definition: src/core/lib/surface/server.cc:1526
api_trace.h
grpc_transport_stream_op_batch::recv_trailing_metadata
bool recv_trailing_metadata
Definition: transport.h:326
grpc::Server::RequestedCall::cq_bound_to_call
grpc_completion_queue *const cq_bound_to_call
Definition: src/core/lib/surface/server.cc:104
GPR_DEBUG
#define GPR_DEBUG
Definition: include/grpc/impl/codegen/log.h:55
grpc_core::Server::MaybeFinishShutdown
void MaybeFinishShutdown() ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_global_) ABSL_LOCKS_EXCLUDED(mu_call_)
Definition: src/core/lib/surface/server.cc:717
GRPC_SRM_PAYLOAD_READ_INITIAL_BYTE_BUFFER
@ GRPC_SRM_PAYLOAD_READ_INITIAL_BYTE_BUFFER
Definition: grpc.h:400
grpc_channel_element_args
Definition: channel_stack.h:74
grpc_call_start_batch_and_execute
grpc_call_error grpc_call_start_batch_and_execute(grpc_call *call, const grpc_op *ops, size_t nops, grpc_closure *closure)
Definition: call.cc:1847
grpc_core::channelz::ListenSocketNode
Definition: channelz.h:351
grpc_core::Timestamp::InfFuture
static constexpr Timestamp InfFuture()
Definition: src/core/lib/gprpp/time.h:79
GRPC_CHANNEL_SHUTDOWN
@ GRPC_CHANNEL_SHUTDOWN
Definition: include/grpc/impl/codegen/connectivity_state.h:40
grpc_op::grpc_op_data::recv_initial_metadata
struct grpc_op::grpc_op_data::grpc_op_recv_initial_metadata recv_initial_metadata
grpc_call_final_info
Definition: channel_stack.h:95
grpc_transport_stream_op_batch_payload::recv_trailing_metadata
grpc_metadata_batch * recv_trailing_metadata
Definition: transport.h:425
GRPC_CQ_CALLBACK
@ GRPC_CQ_CALLBACK
Definition: grpc_types.h:766
absl::StatusOr
Definition: abseil-cpp/absl/status/statusor.h:187
gpr_timespec
Definition: gpr_types.h:50
grpc_error
Definition: error_internal.h:42
function
std::function< bool(GrpcTool *, int, const char **, const CliCredentials &, GrpcToolOutputCallback)> function
Definition: grpc_tool.cc:250
size
voidpf void uLong size
Definition: bloaty/third_party/zlib/contrib/minizip/ioapi.h:136
grpc::Server::RegisteredMethod::~RegisteredMethod
~RegisteredMethod()=default
grpc_op::grpc_op_data::grpc_op_recv_initial_metadata::recv_initial_metadata
grpc_metadata_array * recv_initial_metadata
Definition: grpc_types.h:685
grpc_core::Server::Orphan
void Orphan() ABSL_LOCKS_EXCLUDED(mu_global_) override
Definition: src/core/lib/surface/server.cc:872
grpc_server_destroy
void grpc_server_destroy(grpc_server *server)
Definition: src/core/lib/surface/server.cc:1519
channel_trace.h
GPR_CLOCK_REALTIME
@ GPR_CLOCK_REALTIME
Definition: gpr_types.h:39
regress.m
m
Definition: regress/regress.py:25
method
NSString * method
Definition: ProtoMethod.h:28
grpc_core::CppImplOf< Server, grpc_server >::FromC
static Server * FromC(grpc_server *c_type)
Definition: cpp_impl_of.h:30
grpc_pollset
Definition: bm_cq_multiple_threads.cc:37
grpc_core::Server::ChannelData::InitChannelElement
static grpc_error_handle InitChannelElement(grpc_channel_element *elem, grpc_channel_element_args *args)
Definition: src/core/lib/surface/server.cc:1164
grpc_core::Server::KillPendingWorkLocked
void KillPendingWorkLocked(grpc_error_handle error) ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_call_)
Definition: src/core/lib/surface/server.cc:747
grpc_transport_stream_op_batch
Definition: transport.h:284
grpc::Server::AllocatingRequestMatcherBase::KillRequests
void KillRequests(grpc_error_handle error) override
Definition: src/core/lib/surface/server.cc:345
grpc_closure
Definition: closure.h:56
grpc_pollset_set_add_pollset
void grpc_pollset_set_add_pollset(grpc_pollset_set *pollset_set, grpc_pollset *pollset)
Definition: pollset_set.cc:37
op
static grpc_op * op
Definition: test/core/fling/client.cc:47
grpc_core::Server::CallData::path_
absl::optional< Slice > path_
Definition: src/core/lib/surface/server.h:328
grpc_call_from_top_element
grpc_call * grpc_call_from_top_element(grpc_call_element *surface_element)
Definition: call.cc:1778
GRPC_CALL_ERROR_NOT_SERVER_COMPLETION_QUEUE
@ GRPC_CALL_ERROR_NOT_SERVER_COMPLETION_QUEUE
Definition: grpc_types.h:492
grpc_call_element::channel_data
void * channel_data
Definition: channel_stack.h:196
absl::status_internal::storage
static ABSL_INTERNAL_ATOMIC_HOOK_ATTRIBUTES absl::base_internal::AtomicHook< StatusPayloadPrinter > storage
Definition: abseil-cpp/absl/status/status_payload_printer.cc:26
grpc_core::Server::CallData::CallState::ACTIVATED
@ ACTIVATED
grpc_core::Closure::Run
static void Run(const DebugLocation &location, grpc_closure *closure, grpc_error_handle error)
Definition: closure.h:250
grpc_core::Server::ShutdownRefOnRequest
bool ShutdownRefOnRequest()
Definition: src/core/lib/surface/server.h:403
recv_initial_metadata_
grpc_metadata_array recv_initial_metadata_
Definition: rls.cc:671
grpc_core::Server::CallData::CallData
CallData(grpc_call_element *elem, const grpc_call_element_args &args, RefCountedPtr< Server > server)
Definition: src/core/lib/surface/server.cc:1181
grpc_core::Channel::Create
static absl::StatusOr< RefCountedPtr< Channel > > Create(const char *target, ChannelArgs args, grpc_channel_stack_type channel_stack_type, grpc_transport *optional_transport)
Definition: channel.cc:202
cq
static grpc_completion_queue * cq
Definition: test/core/fling/client.cc:37
call.h
grpc_core::RefCounted::Ref
RefCountedPtr< Child > Ref() GRPC_MUST_USE_RESULT
Definition: ref_counted.h:287
i
uint64_t i
Definition: abseil-cpp/absl/container/btree_benchmark.cc:230
GRPC_ERROR_INT_GRPC_STATUS
@ GRPC_ERROR_INT_GRPC_STATUS
grpc status code representing this error
Definition: error.h:66
grpc_core::Server::ChannelRegisteredMethod::flags
uint32_t flags
Definition: src/core/lib/surface/server.h:209
GRPC_API_TRACE
#define GRPC_API_TRACE(fmt, nargs, args)
Definition: api_trace.h:48
grpc::Server::RealRequestMatcher::RequestCallWithPossiblePublish
void RequestCallWithPossiblePublish(size_t request_queue_index, RequestedCall *call) override
Definition: src/core/lib/surface/server.cc:235
grpc_core::Server::set_config_fetcher
void set_config_fetcher(std::unique_ptr< grpc_server_config_fetcher > config_fetcher)
Definition: src/core/lib/surface/server.h:144
grpc_slice_unref_internal
void grpc_slice_unref_internal(const grpc_slice &slice)
Definition: slice_refcount.h:39
grpc_core::Server::CallData::original_recv_trailing_metadata_ready_
grpc_closure * original_recv_trailing_metadata_ready_
Definition: src/core/lib/surface/server.h:351
grpc_core::Server::CallData::deadline_
Timestamp deadline_
Definition: src/core/lib/surface/server.h:330
error_utils.h
grpc::Server::ChannelData::ConnectivityWatcher::OnConnectivityStateChange
void OnConnectivityStateChange(grpc_connectivity_state new_state, const absl::Status &) override
Definition: src/core/lib/surface/server.cc:980
absl::Notification::WaitForNotification
void WaitForNotification() const
Definition: abseil-cpp/absl/synchronization/notification.cc:48
gpr_time_from_seconds
GPRAPI gpr_timespec gpr_time_from_seconds(int64_t s, gpr_clock_type clock_type)
Definition: src/core/lib/gpr/time.cc:123
original_recv_trailing_metadata_ready_
grpc_closure * original_recv_trailing_metadata_ready_
Definition: message_decompress_filter.cc:128
GRPC_ERROR_IS_NONE
#define GRPC_ERROR_IS_NONE(err)
Definition: error.h:241
grpc_core::Server::ChannelRegisteredMethod::has_host
bool has_host
Definition: src/core/lib/surface/server.h:210
grpc_call_details::reserved
void * reserved
Definition: grpc_types.h:590
channel.h
port_platform.h
grpc_core::Server::GetChannelsLocked
std::vector< RefCountedPtr< Channel > > GetChannelsLocked() const
Definition: src/core/lib/surface/server.cc:759
grpc::Server::RealRequestMatcher::pending_
std::queue< CallData * > pending_
Definition: src/core/lib/surface/server.cc:319


grpc
Author(s):
autogenerated on Fri May 16 2025 03:00:10