|
|
|
@ -59,12 +59,12 @@ class ChannelData { |
|
|
|
|
public: |
|
|
|
|
virtual ~ChannelData() {} |
|
|
|
|
|
|
|
|
|
virtual void StartTransportOp( |
|
|
|
|
grpc_exec_ctx *exec_ctx, grpc_channel_element *elem, |
|
|
|
|
grpc_transport_op *op); |
|
|
|
|
virtual void StartTransportOp(grpc_exec_ctx *exec_ctx, |
|
|
|
|
grpc_channel_element *elem, |
|
|
|
|
grpc_transport_op *op); |
|
|
|
|
|
|
|
|
|
protected: |
|
|
|
|
explicit ChannelData(const grpc_channel_args&) {} |
|
|
|
|
explicit ChannelData(const grpc_channel_args &) {} |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
// Represents call data.
|
|
|
|
@ -73,80 +73,80 @@ class CallData { |
|
|
|
|
public: |
|
|
|
|
virtual ~CallData() {} |
|
|
|
|
|
|
|
|
|
virtual void StartTransportStreamOp( |
|
|
|
|
grpc_exec_ctx *exec_ctx, grpc_call_element *elem, |
|
|
|
|
grpc_transport_stream_op *op); |
|
|
|
|
virtual void StartTransportStreamOp(grpc_exec_ctx *exec_ctx, |
|
|
|
|
grpc_call_element *elem, |
|
|
|
|
grpc_transport_stream_op *op); |
|
|
|
|
|
|
|
|
|
virtual void SetPollsetOrPollsetSet( |
|
|
|
|
grpc_exec_ctx *exec_ctx, grpc_call_element *elem, |
|
|
|
|
grpc_polling_entity *pollent); |
|
|
|
|
virtual void SetPollsetOrPollsetSet(grpc_exec_ctx *exec_ctx, |
|
|
|
|
grpc_call_element *elem, |
|
|
|
|
grpc_polling_entity *pollent); |
|
|
|
|
|
|
|
|
|
virtual char* GetPeer(grpc_exec_ctx *exec_ctx, grpc_call_element *elem); |
|
|
|
|
virtual char *GetPeer(grpc_exec_ctx *exec_ctx, grpc_call_element *elem); |
|
|
|
|
|
|
|
|
|
protected: |
|
|
|
|
explicit CallData(const ChannelData&) {} |
|
|
|
|
explicit CallData(const ChannelData &) {} |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
namespace internal { |
|
|
|
|
|
|
|
|
|
// Defines static members for passing to C core.
|
|
|
|
|
template<typename ChannelDataType, typename CallDataType> |
|
|
|
|
template <typename ChannelDataType, typename CallDataType> |
|
|
|
|
class ChannelFilter { |
|
|
|
|
public: |
|
|
|
|
static const size_t channel_data_size = sizeof(ChannelDataType); |
|
|
|
|
|
|
|
|
|
static void InitChannelElement( |
|
|
|
|
grpc_exec_ctx *exec_ctx, grpc_channel_element *elem, |
|
|
|
|
grpc_channel_element_args *args) { |
|
|
|
|
static void InitChannelElement(grpc_exec_ctx *exec_ctx, |
|
|
|
|
grpc_channel_element *elem, |
|
|
|
|
grpc_channel_element_args *args) { |
|
|
|
|
// Construct the object in the already-allocated memory.
|
|
|
|
|
new (elem->channel_data) ChannelDataType(*args->channel_args); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void DestroyChannelElement( |
|
|
|
|
grpc_exec_ctx *exec_ctx, grpc_channel_element *elem) { |
|
|
|
|
reinterpret_cast<ChannelDataType*>(elem->channel_data)->~ChannelDataType(); |
|
|
|
|
static void DestroyChannelElement(grpc_exec_ctx *exec_ctx, |
|
|
|
|
grpc_channel_element *elem) { |
|
|
|
|
reinterpret_cast<ChannelDataType *>(elem->channel_data)->~ChannelDataType(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void StartTransportOp( |
|
|
|
|
grpc_exec_ctx *exec_ctx, grpc_channel_element *elem, |
|
|
|
|
grpc_transport_op *op) { |
|
|
|
|
ChannelDataType* channel_data = (ChannelDataType*)elem->channel_data; |
|
|
|
|
static void StartTransportOp(grpc_exec_ctx *exec_ctx, |
|
|
|
|
grpc_channel_element *elem, |
|
|
|
|
grpc_transport_op *op) { |
|
|
|
|
ChannelDataType *channel_data = (ChannelDataType *)elem->channel_data; |
|
|
|
|
channel_data->StartTransportOp(exec_ctx, elem, op); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static const size_t call_data_size = sizeof(CallDataType); |
|
|
|
|
|
|
|
|
|
static void InitCallElement( |
|
|
|
|
grpc_exec_ctx *exec_ctx, grpc_call_element *elem, |
|
|
|
|
grpc_call_element_args *args) { |
|
|
|
|
const ChannelDataType& channel_data = *(ChannelDataType*)elem->channel_data; |
|
|
|
|
static void InitCallElement(grpc_exec_ctx *exec_ctx, grpc_call_element *elem, |
|
|
|
|
grpc_call_element_args *args) { |
|
|
|
|
const ChannelDataType &channel_data = |
|
|
|
|
*(ChannelDataType *)elem->channel_data; |
|
|
|
|
// Construct the object in the already-allocated memory.
|
|
|
|
|
new (elem->call_data) CallDataType(channel_data); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void DestroyCallElement( |
|
|
|
|
grpc_exec_ctx *exec_ctx, grpc_call_element *elem, |
|
|
|
|
const grpc_call_stats *stats, void *and_free_memory) { |
|
|
|
|
reinterpret_cast<CallDataType*>(elem->call_data)->~CallDataType(); |
|
|
|
|
static void DestroyCallElement(grpc_exec_ctx *exec_ctx, |
|
|
|
|
grpc_call_element *elem, |
|
|
|
|
const grpc_call_stats *stats, |
|
|
|
|
void *and_free_memory) { |
|
|
|
|
reinterpret_cast<CallDataType *>(elem->call_data)->~CallDataType(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void StartTransportStreamOp( |
|
|
|
|
grpc_exec_ctx *exec_ctx, grpc_call_element *elem, |
|
|
|
|
grpc_transport_stream_op *op) { |
|
|
|
|
CallDataType* call_data = (CallDataType*)elem->call_data; |
|
|
|
|
static void StartTransportStreamOp(grpc_exec_ctx *exec_ctx, |
|
|
|
|
grpc_call_element *elem, |
|
|
|
|
grpc_transport_stream_op *op) { |
|
|
|
|
CallDataType *call_data = (CallDataType *)elem->call_data; |
|
|
|
|
call_data->StartTransportStreamOp(exec_ctx, elem, op); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void SetPollsetOrPollsetSet( |
|
|
|
|
grpc_exec_ctx *exec_ctx, grpc_call_element *elem, |
|
|
|
|
grpc_polling_entity *pollent) { |
|
|
|
|
CallDataType* call_data = (CallDataType*)elem->call_data; |
|
|
|
|
static void SetPollsetOrPollsetSet(grpc_exec_ctx *exec_ctx, |
|
|
|
|
grpc_call_element *elem, |
|
|
|
|
grpc_polling_entity *pollent) { |
|
|
|
|
CallDataType *call_data = (CallDataType *)elem->call_data; |
|
|
|
|
call_data->SetPollsetOrPollsetSet(exec_ctx, elem, pollent); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static char* GetPeer( |
|
|
|
|
grpc_exec_ctx *exec_ctx, grpc_call_element *elem) { |
|
|
|
|
CallDataType* call_data = (CallDataType*)elem->call_data; |
|
|
|
|
static char *GetPeer(grpc_exec_ctx *exec_ctx, grpc_call_element *elem) { |
|
|
|
|
CallDataType *call_data = (CallDataType *)elem->call_data; |
|
|
|
|
return call_data->GetPeer(exec_ctx, elem); |
|
|
|
|
} |
|
|
|
|
}; |
|
|
|
@ -154,10 +154,10 @@ class ChannelFilter { |
|
|
|
|
struct FilterRecord { |
|
|
|
|
grpc_channel_stack_type stack_type; |
|
|
|
|
int priority; |
|
|
|
|
std::function<bool(const grpc_channel_args&)> include_filter; |
|
|
|
|
std::function<bool(const grpc_channel_args &)> include_filter; |
|
|
|
|
grpc_channel_filter filter; |
|
|
|
|
}; |
|
|
|
|
extern std::vector<FilterRecord>* channel_filters; |
|
|
|
|
extern std::vector<FilterRecord> *channel_filters; |
|
|
|
|
|
|
|
|
|
void ChannelFilterPluginInit(); |
|
|
|
|
void ChannelFilterPluginShutdown(); |
|
|
|
@ -169,10 +169,10 @@ void ChannelFilterPluginShutdown(); |
|
|
|
|
// The include_filter argument specifies a function that will be called
|
|
|
|
|
// to determine at run-time whether or not to add the filter. If the
|
|
|
|
|
// value is nullptr, the filter will be added unconditionally.
|
|
|
|
|
template<typename ChannelDataType, typename CallDataType> |
|
|
|
|
template <typename ChannelDataType, typename CallDataType> |
|
|
|
|
void RegisterChannelFilter( |
|
|
|
|
const char* name, grpc_channel_stack_type stack_type, int priority, |
|
|
|
|
std::function<bool(const grpc_channel_args&)> include_filter) { |
|
|
|
|
const char *name, grpc_channel_stack_type stack_type, int priority, |
|
|
|
|
std::function<bool(const grpc_channel_args &)> include_filter) { |
|
|
|
|
// If we haven't been called before, initialize channel_filters and
|
|
|
|
|
// call grpc_register_plugin().
|
|
|
|
|
if (internal::channel_filters == nullptr) { |
|
|
|
@ -184,18 +184,14 @@ void RegisterChannelFilter( |
|
|
|
|
// C-core initialization code calls ChannelFilterPluginInit().
|
|
|
|
|
typedef internal::ChannelFilter<ChannelDataType, CallDataType> FilterType; |
|
|
|
|
internal::FilterRecord filter_record = { |
|
|
|
|
stack_type, priority, include_filter, { |
|
|
|
|
FilterType::StartTransportStreamOp, |
|
|
|
|
FilterType::StartTransportOp, |
|
|
|
|
FilterType::call_data_size, |
|
|
|
|
FilterType::InitCallElement, |
|
|
|
|
FilterType::SetPollsetOrPollsetSet, |
|
|
|
|
FilterType::DestroyCallElement, |
|
|
|
|
FilterType::channel_data_size, |
|
|
|
|
FilterType::InitChannelElement, |
|
|
|
|
FilterType::DestroyChannelElement, |
|
|
|
|
FilterType::GetPeer, |
|
|
|
|
name}}; |
|
|
|
|
stack_type, |
|
|
|
|
priority, |
|
|
|
|
include_filter, |
|
|
|
|
{FilterType::StartTransportStreamOp, FilterType::StartTransportOp, |
|
|
|
|
FilterType::call_data_size, FilterType::InitCallElement, |
|
|
|
|
FilterType::SetPollsetOrPollsetSet, FilterType::DestroyCallElement, |
|
|
|
|
FilterType::channel_data_size, FilterType::InitChannelElement, |
|
|
|
|
FilterType::DestroyChannelElement, FilterType::GetPeer, name}}; |
|
|
|
|
internal::channel_filters->push_back(filter_record); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|