Go to the documentation of this file.
33 #include "absl/memory/memory.h"
34 #include "absl/status/status.h"
35 #include "absl/types/optional.h"
37 #include <grpc/byte_buffer.h>
73 enum class Type { BATCH_CALL, REGISTERED_CALL };
96 data.registered.method =
rm;
126 const char* method_arg,
const char* host_arg,
129 :
method(method_arg == nullptr ?
"" : method_arg),
130 host(host_arg == nullptr ?
"" : host_arg),
141 std::unique_ptr<RequestMatcherInterface>
matcher;
188 virtual void MatchOrQueue(
size_t start_request_queue_index,
244 auto pop_next_pending = [
this, request_queue_index] {
245 PendingCall pending_call;
251 if (pending_call.rc !=
nullptr) {
252 pending_call.calld =
pending_.front();
260 PendingCall next_pending = pop_next_pending();
261 if (next_pending.rc ==
nullptr)
break;
262 if (!next_pending.calld->MaybeActivate()) {
264 next_pending.calld->KillZombie();
266 next_pending.calld->Publish(request_queue_index, next_pending.rc);
281 calld->Publish(cq_idx, rc);
312 calld->Publish(cq_idx, rc);
385 cq(),
static_cast<void*
>(call_info.tag),
nullptr,
388 static_cast<void*
>(call_info.tag), call_info.cq, call_info.call,
389 call_info.initial_metadata, call_info.details);
391 calld->Publish(
cq_idx(), rc);
393 calld->FailCallCreation();
395 server()->ShutdownUnrefOnRequest();
416 RegisteredCallAllocation call_info =
allocator_();
418 cq(), call_info.tag, call_info.optional_payload,
421 new RequestedCall(call_info.tag, call_info.cq, call_info.call,
423 call_info.deadline, call_info.optional_payload);
425 calld->Publish(
cq_idx(), rc);
427 calld->FailCallCreation();
429 server()->ShutdownUnrefOnRequest();
443 class ChannelBroadcaster {
449 void FillChannelsLocked(std::vector<RefCountedPtr<Channel>> channels) {
465 struct ShutdownCleanupArgs {
471 ShutdownCleanupArgs*
a =
static_cast<ShutdownCleanupArgs*
>(
arg);
478 ShutdownCleanupArgs* sc =
new ShutdownCleanupArgs;
480 grpc_schedule_on_exec_ctx);
490 op->disconnect_with_error = send_disconnect;
509 sizeof(Server::CallData),
513 sizeof(Server::ChannelData),
523 RefCountedPtr<channelz::ServerNode> CreateChannelzNode(ChannelArgs
args) {
524 RefCountedPtr<channelz::ServerNode> channelz_node;
527 size_t channel_tracer_max_memory =
std::max(
531 MakeRefCounted<channelz::ServerNode>(channel_tracer_max_memory);
532 channelz_node->AddTraceEvent(
533 channelz::ChannelTrace::Severity::Info,
536 return channelz_node;
554 for (
size_t i = 0;
i <
cqs_.size();
i++) {
561 listener->channelz_listen_socket_node();
579 if (
rm->matcher ==
nullptr) {
580 rm->matcher = absl::make_unique<RealRequestMatcher>(
this);
598 listener.listener->Start(
this, &
pollsets_);
619 for (cq_idx = 0; cq_idx <
cqs_.size(); cq_idx++) {
622 if (cq_idx ==
cqs_.size()) {
624 cq_idx =
static_cast<size_t>(rand()) %
cqs_.size();
628 if (socket_node !=
nullptr) {
629 channelz_socket_uuid = socket_node->uuid();
634 channelz_socket_uuid);
646 RegisteredMethod*
rm =
static_cast<RegisteredMethod*
>(method_tag);
647 rm->matcher = absl::make_unique<AllocatingRequestMatcherRegistered>(
655 absl::make_unique<AllocatingRequestMatcherBatch>(
this,
cq,
670 return (
a.empty() &&
b ==
nullptr) ||
671 ((
b !=
nullptr) && !strcmp(
a.c_str(),
b));
677 const char*
method,
const char* host,
682 "grpc_server_register_method method string cannot be NULL");
686 if (streq(
m->method,
method) && streq(
m->host, host)) {
703 delete static_cast<RequestedCall*
>(
req);
709 rc->initial_metadata->count = 0;
732 "Waiting for %" PRIuPTR
" channels and %" PRIuPTR
"/%" PRIuPTR
733 " listeners to be destroyed before shutting down server",
739 shutdown_published_ =
true;
740 for (
auto& shutdown_tag : shutdown_tags_) {
753 rm->matcher->ZombifyPending();
760 std::vector<RefCountedPtr<Channel>> channels;
763 channels.push_back(chand->channel()->Ref());
771 server->listeners_destroyed_++;
772 server->MaybeFinishShutdown();
799 ChannelBroadcaster broadcaster;
808 if (shutdown_published_) {
813 shutdown_tags_.emplace_back(
tag,
cq);
829 if (await_requests !=
nullptr) {
838 if (listener.listener ==
nullptr)
continue;
840 listener.listener->channelz_listen_socket_node();
841 if (
channelz_node_ !=
nullptr && channelz_listen_socket_node !=
nullptr) {
843 channelz_listen_socket_node->
uuid());
846 grpc_schedule_on_exec_ctx);
847 listener.listener->SetOnDestroyDone(&listener.destroy_done);
848 listener.listener.reset();
853 ChannelBroadcaster broadcaster;
858 broadcaster.BroadcastShutdown(
864 ChannelBroadcaster broadcaster;
884 if ((
rm ==
nullptr && optional_payload !=
nullptr) ||
885 ((
rm !=
nullptr) && ((optional_payload ==
nullptr) !=
900 if (
cqs_[
idx] == cq_for_notification) {
922 RequestMatcherInterface*
rm;
924 case RequestedCall::Type::BATCH_CALL:
927 case RequestedCall::Type::REGISTERED_CALL:
928 rm = rc->data.registered.method->matcher.get();
931 rm->RequestCallWithPossiblePublish(cq_idx, rc);
943 &cq_idx, cq_for_notification,
tag,
nullptr,
nullptr);
948 new RequestedCall(
tag, cq_bound_to_call,
call, request_metadata,
details);
959 &cq_idx, cq_for_notification, tag_new, optional_payload,
rm);
964 new RequestedCall(tag_new, cq_bound_to_call,
call, request_metadata,
rm,
965 deadline, optional_payload);
973 class Server::ChannelData::ConnectivityWatcher
974 :
public AsyncConnectivityStateWatcherInterface {
1009 server_->MaybeFinishShutdown();
1022 channelz_socket_uuid_ = channelz_socket_uuid;
1025 size_t num_registered_methods =
server_->registered_methods_.size();
1026 if (num_registered_methods > 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_) {
1034 const bool has_host = !
rm->host.empty();
1040 for (probes = 0; (*registered_methods_)[(
hash + probes) % slots]
1041 .server_registered_method !=
nullptr;
1044 if (probes > max_probes) max_probes = probes;
1046 &(*registered_methods_)[(
hash + probes) % slots];
1056 registered_method_max_probes_ = max_probes;
1061 server_->channels_.push_front(
this);
1062 list_position_ =
server_->channels_.begin();
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 =
1084 for (
size_t i = 0;
i <= registered_method_max_probes_;
i++) {
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;
1095 for (
size_t i = 0;
i <= registered_method_max_probes_;
i++) {
1098 if (
rm->server_registered_method ==
nullptr)
break;
1099 if (
rm->has_host)
continue;
1100 if (
rm->method !=
path)
continue;
1107 const void* transport_server_data) {
1111 args.channel = chand->channel_;
1112 args.server = chand->server_.get();
1113 args.parent =
nullptr;
1114 args.propagation_mask = 0;
1116 args.pollset_set_alternative =
nullptr;
1117 args.server_transport_data = transport_server_data;
1126 calld->FailCallCreation();
1136 auto* channel_stack = chand->channel_->channel_stack();
1137 chand->channel_.reset();
1143 if (!list_position_.has_value())
return;
1145 server_->channels_.erase(*list_position_);
1146 list_position_.reset();
1148 server_->MaybeFinishShutdown();
1151 "Server::ChannelData::Destroy");
1153 grpc_schedule_on_exec_ctx);
1159 op->set_accept_stream =
true;
1188 elem, grpc_schedule_on_exec_ctx);
1190 elem, grpc_schedule_on_exec_ctx);
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);
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)) {
1218 }
else if (
state_.compare_exchange_strong(
1219 expected_pending, CallState::ZOMBIED,
1220 std::memory_order_acq_rel, std::memory_order_relaxed)) {
1233 RecvInitialMetadataBatchComplete,
elem,
1234 grpc_schedule_on_exec_ctx);
1236 &recv_initial_metadata_batch_complete_);
1242 cq_new_ =
server_->cqs_[cq_idx];
1243 std::swap(*rc->initial_metadata, initial_metadata_);
1245 case RequestedCall::Type::BATCH_CALL:
1249 rc->data.batch.details->method =
1251 rc->data.batch.details->deadline =
1253 rc->data.batch.details->flags = recv_initial_metadata_flags_;
1255 case RequestedCall::Type::REGISTERED_CALL:
1256 *rc->data.registered.deadline =
1258 if (rc->data.registered.optional_payload !=
nullptr) {
1259 *rc->data.registered.optional_payload = payload_;
1267 rc, &rc->completion,
true);
1274 RequestMatcherInterface*
rm = calld->matcher_;
1277 calld->state_.store(CallState::ZOMBIED, std::memory_order_relaxed);
1278 calld->KillZombie();
1281 rm->MatchOrQueue(chand->cq_idx(), calld);
1294 grpc_schedule_on_exec_ctx);
1300 if (
server_->ShutdownCalled()) {
1301 state_.store(CallState::ZOMBIED, std::memory_order_relaxed);
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;
1318 switch (payload_handling) {
1329 grpc_schedule_on_exec_ctx);
1343 calld->FailCallCreation();
1346 calld->StartNewRpc(
elem);
1360 &recv_initial_metadata_flags_;
1379 if (host !=
nullptr) calld->
host_.emplace(host->Ref());
1384 if (op_deadline.has_value()) {
1387 if (calld->
host_.has_value() && calld->
path_.has_value()) {
1393 "Missing :authority or :path", &src_error, 1);
1403 "continue server recv_trailing_metadata_ready");
1416 RecvTrailingMetadataReady,
elem,
1417 grpc_schedule_on_exec_ctx);
1419 "deferring server recv_trailing_metadata_ready "
1420 "until after recv_initial_metadata_ready");
1461 .channel_args_preconditioning()
1462 .PreconditionChannelArgs(
args));
1470 "grpc_server_register_completion_queue(server=%p, cq=%p, reserved=%p)", 3,
1476 "Completion queue of type %d is being registered as a "
1477 "server-completion-queue",
1478 static_cast<int>(cq_type));
1490 "grpc_server_register_method(server=%p, method=%s, host=%s, "
1507 GRPC_API_TRACE(
"grpc_server_shutdown_and_notify(server=%p, cq=%p, tag=%p)", 3,
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)",
1540 cq_for_notification,
tag));
1542 call,
details, request_metadata, cq_bound_to_call, cq_for_notification,
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, "
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);
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));
1585 GRPC_API_TRACE(
"grpc_server_config_fetcher_destroy(config_fetcher=%p)", 1,
1586 (server_config_fetcher));
1587 delete server_config_fetcher;
AllocatingRequestMatcherBatch(Server *server, grpc_completion_queue *cq, std::function< BatchCallAllocation()> allocator)
#define GRPC_CLOSURE_INIT(closure, cb, cb_arg, scheduler)
grpc_error_handle SetupTransport(grpc_transport *transport, grpc_pollset *accepting_pollset, const grpc_channel_args *args, const RefCountedPtr< channelz::SocketNode > &socket_node)
CallCombiner * call_combiner_
static void ListenerDestroyDone(void *arg, grpc_error_handle error)
MultiProducerSingleConsumerQueue::Node mpscq_node
virtual void Destroy(grpc_channel_element *)
uint32_t MixHash32(uint32_t a, uint32_t b)
RefCountedPtr< channelz::SubchannelNode > channelz_node_
void grpc_server_cancel_all_calls(grpc_server *server)
absl::optional< std::list< ChannelData * >::iterator > list_position_
grpc_metadata_batch * recv_initial_metadata_
void MatchOrQueue(size_t start_request_queue_index, CallData *calld) override
void SendGoaways() ABSL_LOCKS_EXCLUDED(mu_global_
const grpc_slice & grpc_slice_ref_internal(const grpc_slice &slice)
~RealRequestMatcher() override
grpc_byte_buffer ** optional_payload
size_t request_queue_count() const override
grpc_error_handle grpc_call_create(grpc_call_create_args *args, grpc_call **out_call)
grpc_channel_element * grpc_channel_stack_element(grpc_channel_stack *channel_stack, size_t index)
#define GPR_DEBUG_ASSERT(x)
RegisteredMethod *const registered_method_
static void send_goaway(grpc_chttp2_transport *t, grpc_error_handle error, bool immediate_disconnect_hint)
std::unique_ptr< RequestMatcherInterface > matcher
grpc_error_handle recv_initial_metadata_error_
GPRAPI grpc_slice grpc_slice_from_copied_string(const char *source)
void grpc_call_set_completion_queue(grpc_call *call, grpc_completion_queue *cq)
static void StartTransportStreamOpBatch(grpc_call_element *elem, grpc_transport_stream_op_batch *batch)
RealRequestMatcher(Server *server)
std::unique_ptr< RequestMatcherInterface > unregistered_request_matcher_
void grpc_channel_next_op(grpc_channel_element *elem, grpc_transport_op *op)
void Publish(size_t cq_idx, RequestedCall *rc)
std::function< BatchCallAllocation()> allocator_
absl::Notification * ShutdownUnrefOnShutdownCall() ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_global_) GRPC_MUST_USE_RESULT
std::vector< RefCountedPtr< Channel > > channels_
std::vector< grpc_pollset * > pollsets_
grpc_call_details * details
Server * server() const override
#define GRPC_CHANNEL_STACK_UNREF(channel_stack, reason)
RegisteredMethod * server_registered_method
grpc_closure recv_initial_metadata_ready_
void grpc_transport_perform_op(grpc_transport *transport, grpc_transport_op *op)
@ GRPC_CALL_ERROR_COMPLETION_QUEUE_SHUTDOWN
static ChannelArgs FromC(const grpc_channel_args *args)
grpc_completion_queue * cq() const
void MatchOrQueue(size_t, CallData *calld) override
std::list< Listener > listeners_
void CancelAllCalls() ABSL_LOCKS_EXCLUDED(mu_global_)
grpc_channel_stack * grpc_channel_get_channel_stack(grpc_channel *channel)
#define GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING(desc, errs, count)
void MatchOrQueue(size_t, CallData *calld) override
grpc_server * grpc_server_create(const grpc_channel_args *args, void *reserved)
RegisteredMethod * RegisterMethod(const char *method, const char *host, grpc_server_register_method_payload_handling payload_handling, uint32_t flags)
#define GRPC_ARG_ENABLE_CHANNELZ
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)
void InitTransport(RefCountedPtr< Server > server, RefCountedPtr< Channel > channel, size_t cq_idx, grpc_transport *transport, intptr_t channelz_socket_uuid)
void grpc_call_stack_ignore_set_pollset_or_pollset_set(grpc_call_element *, grpc_polling_entity *)
grpc_call_element * grpc_call_stack_element(grpc_call_stack *call_stack, size_t index)
void SetBatchMethodAllocator(grpc_completion_queue *cq, std::function< BatchCallAllocation()> allocator)
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)
void SetState(CallState state)
virtual ~RequestMatcherInterface()
void grpc_server_register_completion_queue(grpc_server *server, grpc_completion_queue *cq, void *reserved)
grpc_error_handle recv_trailing_metadata_error_
#define GRPC_TRACE_FLAG_ENABLED(f)
static grpc_call_error ValidateServerRequest(grpc_completion_queue *cq_for_notification, void *tag, grpc_byte_buffer **optional_payload, RegisteredMethod *rm)
grpc_server_register_method_payload_handling
grpc_closure * original_recv_initial_metadata_ready_
RefCountedPtr< channelz::ServerNode > channelz_node_
std::unique_ptr< grpc_server_config_fetcher > config_fetcher_
struct grpc_op::grpc_op_data::grpc_op_recv_message recv_message
bool HasOpenConnections() ABSL_LOCKS_EXCLUDED(mu_global_)
virtual void RequestCallWithPossiblePublish(size_t request_queue_index, RequestedCall *call)=0
bool ShutdownReady() const
union grpc_op::grpc_op_data data
intptr_t channelz_socket_uuid_
AllocatingRequestMatcherRegistered(Server *server, grpc_completion_queue *cq, RegisteredMethod *rm, std::function< RegisteredCallAllocation()> allocator)
static void DoneShutdownEvent(void *server, grpc_cq_completion *)
#define GRPC_ENABLE_CHANNELZ_DEFAULT
void StartNewRpc(grpc_call_element *elem)
grpc_error_handle recv_initial_metadata_error_
static void RecvTrailingMetadataReady(void *arg, grpc_error_handle error)
GRPCAPI void grpc_metadata_array_destroy(grpc_metadata_array *array)
grpc_call_stack * grpc_call_get_call_stack(grpc_call *call)
virtual void MatchOrQueue(size_t start_request_queue_index, CallData *calld)=0
struct grpc_byte_buffer ** recv_message
std::vector< grpc_completion_queue * > cqs_
static void DestroyChannelElement(grpc_channel_element *elem)
grpc_error_handle grpc_error_add_child(grpc_error_handle src, grpc_error_handle child)
ChannelRegisteredMethod * GetRegisteredMethod(const grpc_slice &host, const grpc_slice &path)
void grpc_server_start(grpc_server *server)
wrapped_grpc_channel * channel
#define GRPC_STATS_INC_SERVER_REQUESTED_CALLS()
struct grpc_core::Server::RequestedCall::@37::@39 registered
static void DestroyCallElement(grpc_call_element *elem, const grpc_call_final_info *, grpc_closure *)
@ GRPC_OP_RECV_INITIAL_METADATA
constexpr absl::remove_reference_t< T > && move(T &&t) noexcept
static const grpc_channel_filter kServerTopFilter
void SetRegisteredMethodAllocator(grpc_completion_queue *cq, void *method_tag, std::function< RegisteredCallAllocation()> allocator)
TraceFlag grpc_server_channel_trace(false, "server_channel")
GPRAPI int gpr_time_cmp(gpr_timespec a, gpr_timespec b)
void grpc_pollset_set_del_pollset(grpc_pollset_set *pollset_set, grpc_pollset *pollset)
grpc_metadata_array *const initial_metadata
static const CoreConfiguration & Get()
virtual size_t request_queue_count() const =0
def c_str(s, encoding='ascii')
grpc_closure recv_trailing_metadata_ready_
virtual void ZombifyPending()=0
static void * tag(intptr_t t)
grpc_cq_completion_type grpc_get_cq_completion_type(grpc_completion_queue *cq)
std::list< ChannelData * > channels_
virtual Server * server() const =0
void grpc_channel_stack_no_post_init(grpc_channel_stack *, grpc_channel_element *)
GRPCAPI void grpc_call_unref(grpc_call *call)
GPRAPI gpr_timespec gpr_time_sub(gpr_timespec a, gpr_timespec b)
RefCountedPtr< Server > Ref() GRPC_MUST_USE_RESULT
GPRAPI void gpr_log(const char *file, int line, gpr_log_severity severity, const char *format,...) GPR_PRINT_FORMAT_CHECK(4
RegisteredMethod(const char *method_arg, const char *host_arg, grpc_server_register_method_payload_handling payload_handling_arg, uint32_t flags_arg)
void Start(grpc_call_element *elem)
RegisteredMethod * method
size_t request_queue_count() const override
const grpc_channel_args * channel_args_
static PyObject * Pop(PyObject *pself, PyObject *args)
#define GRPC_MAX_CHANNEL_TRACE_EVENT_MEMORY_PER_NODE_DEFAULT
struct grpc_call grpc_call
grpc_cq_completion completion
grpc_pollset * grpc_cq_pollset(grpc_completion_queue *cq)
#define GRPC_STATS_INC_SERVER_CQS_CHECKED(value)
void grpc_channel_next_get_info(grpc_channel_element *elem, const grpc_channel_info *channel_info)
struct grpc_core::Server::RequestedCall::@37::@38 batch
#define GRPC_CALL_COMBINER_STOP(call_combiner, reason)
void AddListener(OrphanablePtr< ListenerInterface > listener)
RequestedCall(void *tag_arg, grpc_completion_queue *call_cq, grpc_call **call_arg, grpc_metadata_array *initial_md, grpc_call_details *details)
void grpc_channel_args_destroy(grpc_channel_args *a)
const grpc_server_register_method_payload_handling payload_handling
RefCountedPtr< Channel > channel_
GPRAPI grpc_slice grpc_slice_from_static_string(const char *source)
grpc_transport_stream_op_batch_payload * payload
void swap(Json::Value &a, Json::Value &b)
Specialize std::swap() for Json::Value.
CallCombiner * call_combiner_
void StartTransportStreamOpBatchImpl(grpc_call_element *elem, grpc_transport_stream_op_batch *batch)
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)
struct grpc_server grpc_server
void Start() ABSL_LOCKS_EXCLUDED(mu_global_)
gpr_timespec last_shutdown_message_time_
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)
grpc_transport_op * grpc_make_transport_op(grpc_closure *on_complete)
void grpc_call_next_op(grpc_call_element *elem, grpc_transport_stream_op_batch *op)
void grpc_server_shutdown_and_notify(grpc_server *server, grpc_completion_queue *cq, void *tag)
grpc_transport_stream_op_batch * batch
void ShutdownAndNotify(grpc_completion_queue *cq, void *tag) ABSL_LOCKS_EXCLUDED(mu_global_
static bool rm(upb_table *t, lookupkey_t key, upb_value *val, upb_tabkey *removed, uint32_t hash, eqlfunc_t *eql)
static void PublishNewRpc(void *arg, grpc_error_handle error)
bool grpc_cq_can_listen(grpc_completion_queue *cq)
#define GRPC_CALL_COMBINER_START(call_combiner, closure, error, reason)
GPRAPI gpr_timespec gpr_now(gpr_clock_type clock)
absl::optional< Slice > host_
void Destroy() ABSL_EXCLUSIVE_LOCKS_REQUIRED(server_ -> mu_global_)
#define GRPC_ERROR_CREATE_FROM_STATIC_STRING(desc)
ConnectivityWatcher(ChannelData *chand)
static void AcceptStream(void *arg, grpc_transport *, const void *transport_server_data)
void ZombifyPending() override
static grpc_slice details
void RequestCallWithPossiblePublish(size_t, RequestedCall *) final
#define GRPC_CHANNEL_STACK_REF(channel_stack, reason)
grpc_call_error QueueRequestedCall(size_t cq_idx, RequestedCall *rc)
void grpc_server_set_config_fetcher(grpc_server *server, grpc_server_config_fetcher *server_config_fetcher)
const RefCountedPtr< Channel > channel_
bool recv_initial_metadata
std::function< RegisteredCallAllocation()> allocator_
grpc_closure * original_recv_initial_metadata_ready_
static void RecvInitialMetadataBatchComplete(void *arg, grpc_error_handle error)
bool seen_recv_trailing_metadata_ready_
bool grpc_cq_begin_op(grpc_completion_queue *cq, void *tag)
static void FinishDestroy(void *arg, grpc_error_handle error)
std::unique_ptr< std::vector< ChannelRegisteredMethod > > registered_methods_
void RegisterCompletionQueue(grpc_completion_queue *cq)
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)
#define GRPC_ERROR_REF(err)
grpc_error_handle absl_status_to_grpc_error(absl::Status status)
size_t listeners_destroyed_
static grpc_error_handle InitCallElement(grpc_call_element *elem, const grpc_call_element_args *args)
@ GRPC_CALL_ERROR_PAYLOAD_TYPE_MISMATCH
grpc_error_handle grpc_error_set_int(grpc_error_handle src, grpc_error_ints which, intptr_t value)
grpc_closure recv_initial_metadata_ready_
grpc_completion_queue *const cq_
grpc_call_error ValidateServerRequestAndCq(size_t *cq_idx, grpc_completion_queue *cq_for_notification, void *tag, grpc_byte_buffer **optional_payload, RegisteredMethod *rm)
#define GRPC_ARG_MAX_CHANNEL_TRACE_EVENT_MEMORY_PER_NODE
Server * server() const override
grpc_core::ExecCtx exec_ctx
std::string grpc_error_std_string(grpc_error_handle error)
std::vector< LockedMultiProducerSingleConsumerQueue > requests_per_cq_
const grpc_channel_args *const channel_args_
void ZombifyPending() override
void KillRequests(grpc_error_handle error) override
static Slice FromExternalString(absl::string_view str)
std::unique_ptr< T, Deleter > OrphanablePtr
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)
#define GRPC_STATS_INC_SERVER_SLOWPATH_REQUESTS_QUEUED()
void grpc_server_config_fetcher_destroy(grpc_server_config_fetcher *server_config_fetcher)
bool ShutdownCalled() const
#define GRPC_CQ_INTERNAL_UNREF(cq, reason)
grpc_metadata_batch * recv_initial_metadata
grpc_closure recv_trailing_metadata_ready_
virtual void KillRequests(grpc_error_handle error)=0
GRPCAPI void grpc_byte_buffer_destroy(grpc_byte_buffer *bb)
uint32_t grpc_slice_hash_internal(const grpc_slice &s)
RefCountedPtr< Server > server_
void FailCall(size_t cq_idx, RequestedCall *rc, grpc_error_handle error)
static void DoneRequestEvent(void *req, grpc_cq_completion *completion)
union grpc_core::Server::RequestedCall::@37 data
#define GRPC_CQ_INTERNAL_REF(cq, reason)
std::vector< std::unique_ptr< RegisteredMethod > > registered_methods_
#define GRPC_ERROR_UNREF(err)
static void Run(const DebugLocation &location, grpc_closure *closure, grpc_error_handle error)
grpc_connectivity_state state_
AllocatingRequestMatcherBase(Server *server, grpc_completion_queue *cq)
struct grpc_channel grpc_channel
ChannelData *const chand_
static void RecvInitialMetadataReady(void *arg, grpc_error_handle error)
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)
bool recv_trailing_metadata
grpc_completion_queue *const cq_bound_to_call
void MaybeFinishShutdown() ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_global_) ABSL_LOCKS_EXCLUDED(mu_call_)
@ GRPC_SRM_PAYLOAD_READ_INITIAL_BYTE_BUFFER
grpc_call_error grpc_call_start_batch_and_execute(grpc_call *call, const grpc_op *ops, size_t nops, grpc_closure *closure)
static constexpr Timestamp InfFuture()
struct grpc_op::grpc_op_data::grpc_op_recv_initial_metadata recv_initial_metadata
grpc_metadata_batch * recv_trailing_metadata
~RegisteredMethod()=default
void Orphan() ABSL_LOCKS_EXCLUDED(mu_global_) override
void grpc_server_destroy(grpc_server *server)
static Server * FromC(grpc_server *c_type)
static grpc_error_handle InitChannelElement(grpc_channel_element *elem, grpc_channel_element_args *args)
void KillPendingWorkLocked(grpc_error_handle error) ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_call_)
void KillRequests(grpc_error_handle error) override
void grpc_pollset_set_add_pollset(grpc_pollset_set *pollset_set, grpc_pollset *pollset)
absl::optional< Slice > path_
grpc_call * grpc_call_from_top_element(grpc_call_element *surface_element)
@ GRPC_CALL_ERROR_NOT_SERVER_COMPLETION_QUEUE
static ABSL_INTERNAL_ATOMIC_HOOK_ATTRIBUTES absl::base_internal::AtomicHook< StatusPayloadPrinter > storage
static void Run(const DebugLocation &location, grpc_closure *closure, grpc_error_handle error)
bool ShutdownRefOnRequest()
grpc_metadata_array recv_initial_metadata_
CallData(grpc_call_element *elem, const grpc_call_element_args &args, RefCountedPtr< Server > server)
static absl::StatusOr< RefCountedPtr< Channel > > Create(const char *target, ChannelArgs args, grpc_channel_stack_type channel_stack_type, grpc_transport *optional_transport)
static grpc_completion_queue * cq
RefCountedPtr< Child > Ref() GRPC_MUST_USE_RESULT
@ GRPC_ERROR_INT_GRPC_STATUS
grpc status code representing this error
#define GRPC_API_TRACE(fmt, nargs, args)
void RequestCallWithPossiblePublish(size_t request_queue_index, RequestedCall *call) override
void set_config_fetcher(std::unique_ptr< grpc_server_config_fetcher > config_fetcher)
void grpc_slice_unref_internal(const grpc_slice &slice)
grpc_closure * original_recv_trailing_metadata_ready_
void OnConnectivityStateChange(grpc_connectivity_state new_state, const absl::Status &) override
void WaitForNotification() const
GPRAPI gpr_timespec gpr_time_from_seconds(int64_t s, gpr_clock_type clock_type)
grpc_closure * original_recv_trailing_metadata_ready_
#define GRPC_ERROR_IS_NONE(err)
std::vector< RefCountedPtr< Channel > > GetChannelsLocked() const
std::queue< CallData * > pending_
grpc
Author(s):
autogenerated on Fri May 16 2025 03:00:10