diff --git a/src/core/lib/channel/channel_stack.cc b/src/core/lib/channel/channel_stack.cc index e71fe67784e..3f8edc6dc4f 100644 --- a/src/core/lib/channel/channel_stack.cc +++ b/src/core/lib/channel/channel_stack.cc @@ -28,6 +28,7 @@ #include #include "src/core/lib/channel/channel_args.h" +#include "src/core/lib/channel/channel_fwd.h" #include "src/core/lib/channel/channel_stack_trace.h" #include "src/core/lib/gpr/alloc.h" #include "src/core/lib/surface/channel_init.h" @@ -320,3 +321,19 @@ grpc_channel_stack::MakeServerCallPromise(grpc_core::CallArgs call_args) { return ServerNext(grpc_channel_stack_element(this, this->count - 1))( std::move(call_args)); } + +void grpc_channel_stack::InitClientCallSpine( + grpc_core::CallSpineInterface* call) { + for (size_t i = 0; i < count; i++) { + auto* elem = grpc_channel_stack_element(this, i); + elem->filter->init_call(elem, call); + } +} + +void grpc_channel_stack::InitServerCallSpine( + grpc_core::CallSpineInterface* call) { + for (size_t i = 0; i < count; i++) { + auto* elem = grpc_channel_stack_element(this, count - 1 - i); + elem->filter->init_call(elem, call); + } +} diff --git a/src/core/lib/channel/channel_stack.h b/src/core/lib/channel/channel_stack.h index 5b6649a9eac..1a17bb90847 100644 --- a/src/core/lib/channel/channel_stack.h +++ b/src/core/lib/channel/channel_stack.h @@ -244,6 +244,9 @@ struct grpc_channel_stack { MakeClientCallPromise(grpc_core::CallArgs call_args); grpc_core::ArenaPromise MakeServerCallPromise(grpc_core::CallArgs call_args); + + void InitClientCallSpine(grpc_core::CallSpineInterface* call); + void InitServerCallSpine(grpc_core::CallSpineInterface* call); }; // A call stack tracks a set of related filters for one call, and guarantees diff --git a/src/core/lib/transport/transport.h b/src/core/lib/transport/transport.h index d35bdf5179a..4beb800367f 100644 --- a/src/core/lib/transport/transport.h +++ b/src/core/lib/transport/transport.h @@ -491,6 +491,11 @@ class CallHandler { const RefCountedPtr spine_; }; +struct CallInitiatorAndHandler { + CallInitiator initiator; + CallHandler handler; +}; + template auto OutgoingMessages(CallHalf& h) { struct Wrapper {