@ -74,6 +74,12 @@
namespace grpc_core {
// HACK: If a filter has this type as a base class it will be skipped in
// v3 filter stacks. This is a temporary measure to allow the v3 filter stack
// to be bought up whilst some tests inadvertently rely on hard to convert
// filters.
class HackyHackyHackySkipInV3FilterStacks { } ;
class ChannelFilter {
public :
class Args {
@ -1906,9 +1912,11 @@ struct ChannelFilterWithFlagsMethods {
// ChannelArgs channel_args, ChannelFilter::Args filter_args);
// };
template < typename F , FilterEndpoint kEndpoint , uint8_t kFlags = 0 >
absl : : enable_if_t < std : : is_base_of < ChannelFilter , F > : : value & &
! std : : is_base_of < ImplementChannelFilter < F > , F > : : value ,
grpc_channel_filter >
absl : : enable_if_t <
std : : is_base_of < ChannelFilter , F > : : value & &
! std : : is_base_of < ImplementChannelFilter < F > , F > : : value & &
! std : : is_base_of < HackyHackyHackySkipInV3FilterStacks , F > : : value ,
grpc_channel_filter >
MakePromiseBasedFilter ( const char * name ) {
using CallData = promise_filter_detail : : CallData < kEndpoint > ;
@ -1946,6 +1954,52 @@ MakePromiseBasedFilter(const char* name) {
} ;
}
template < typename F , FilterEndpoint kEndpoint , uint8_t kFlags = 0 >
absl : : enable_if_t <
std : : is_base_of < HackyHackyHackySkipInV3FilterStacks , F > : : value ,
grpc_channel_filter >
MakePromiseBasedFilter ( const char * name ) {
using CallData = promise_filter_detail : : CallData < kEndpoint > ;
return grpc_channel_filter {
// start_transport_stream_op_batch
promise_filter_detail : : BaseCallDataMethods : : StartTransportStreamOpBatch ,
// make_call_promise
promise_filter_detail : : ChannelFilterMethods : : MakeCallPromise ,
[ ] ( grpc_channel_element * elem , CallSpineInterface * ) {
GRPC_LOG_EVERY_N_SEC (
1 , GPR_ERROR ,
" gRPC V3 call stack in use, with a filter ('%s') that is not V3. " ,
elem - > filter - > name ) ;
} ,
// start_transport_op
promise_filter_detail : : ChannelFilterMethods : : StartTransportOp ,
// sizeof_call_data
sizeof ( CallData ) ,
// init_call_elem
promise_filter_detail : : CallDataFilterWithFlagsMethods <
CallData , kFlags > : : InitCallElem ,
// set_pollset_or_pollset_set
promise_filter_detail : : BaseCallDataMethods : : SetPollsetOrPollsetSet ,
// destroy_call_elem
promise_filter_detail : : CallDataFilterWithFlagsMethods <
CallData , kFlags > : : DestroyCallElem ,
// sizeof_channel_data
sizeof ( F ) ,
// init_channel_elem
promise_filter_detail : : ChannelFilterWithFlagsMethods <
F , kFlags > : : InitChannelElem ,
// post_init_channel_elem
promise_filter_detail : : ChannelFilterMethods : : PostInitChannelElem ,
// destroy_channel_elem
promise_filter_detail : : ChannelFilterMethods : : DestroyChannelElem ,
// get_channel_info
promise_filter_detail : : ChannelFilterMethods : : GetChannelInfo ,
// name
name ,
} ;
}
template < typename F , FilterEndpoint kEndpoint , uint8_t kFlags = 0 >
absl : : enable_if_t < std : : is_base_of < ImplementChannelFilter < F > , F > : : value ,
grpc_channel_filter >